Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Помогите исправить ошибку с указателем!!
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
5neverthesame94 5neverthesame94 вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.02.2012
По умолчанию Помогите исправить ошибку с указателем!! - 01.11.2012, 22:21

Привет!
Есть пролема с указателем.
В общем программа делает реверс строчки , при этом используя одну функцию непосредственно для реверса,а другую - для обработки неоглашенных параметров...в общем проблема с указателями end и str в функции reverse....ПОМОГИТЕ ПОЖАЛУЙСТА!!!!!!!!!!!!!


cpp Код:
#include<stdio.h>
#include<conio.h>
#define N 10
#define M 31

void reverse(char *str)
{
    char *end;
    char temp;
   
    for(end=str;*end!='\0';end++)
        ;
   
    end--;

    while(str!=end){
        temp=*str;
        *str=*end;
        *end=temp;
        str++;end--;
    }
}

void func(int k,char* st1,...)
{
    int i=1;
    char* *pst=&st1;
    do{
        reverse(*pst);
        puts(*pst);
        i++;
        pst+=sizeof(char*);
    }while(i<=k);
}

int main(void)
{
    int k;
    char string[N][M];

    puts("Enter the number of strings: ");
    scanf("%d",&k);
    puts("\nEnter strings:\n");
   
    for(int i=0;i<k;i++){
        printf("%d)",i+1);
        scanf("%s",&string[i]);
    }
   
    func(k,string[0],string[1],string[2]);

    getch();
    return 0;
}

Последний раз редактировалось Влад; 02.11.2012 в 09:40
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 02.11.2012, 09:45

А в чем проблема с указателями заключается? Что именно происходит не так, как ты ожидаешь?

[телепатический угадыватель вкл.]

Может, дело в том, что условие цикла нужно записать немного иначе? Примерно так:
cpp Код:
while(reinterpret_cast<unsigned long>(str) < reinterpret_cast<unsigned long>(end)) {

[/телепатический угадыватель выкл.]


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#3 (permalink)) Старый
5neverthesame94 5neverthesame94 вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.02.2012
По умолчанию 02.11.2012, 15:17

При входе в reverse говорит,что end - неправильный указатель,а уже при втором входе в reverse при выполнении цикла for выдаёт ошибку: Необработанное исключение в "0x00081412" в "laba_4.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000".

Не знаю,в чём тут дело....
Ответить с цитированием
  (#4 (permalink)) Старый
Matematic Matematic вне форума
Member
 
Аватар для Matematic
 
Сообщений: 388
Сказал(а) спасибо: 31
Поблагодарили 8 раз(а) в 8 сообщениях
Регистрация: 15.01.2007
По умолчанию 04.11.2012, 08:50

В программе нашел 3 ошибки.

1.
Первая, как правильно было замечено, в функции reverse() в цикле while
вместо
Код:
while(str!=end)
нужно было написать
Код:
while(str<end)
(указатели в C/C++ допускают сравнение и операции < и > к ним применимы, как и к обычным целым числам).

Иначе функция не будет работать со строками, в которых число символов четно - получится вечный цикл, который и приведет к указанной страничной ошибке. Для строк с нечетным количеством символов будет работать даже первый неправильный вариант.


2.
Вторая ошибка в функции func()
Вместо
Код:
pst+=sizeof(char*);
должно быть
Код:
pst++;
Именно эта операция увеличит значение указателя pst на размер, занимаемый переменной char *, т. е. на sizeof(char *). Адресная арифметика C учитывает этот момент автоматически.
Операция же pst+=sizeof (char *) увеличит pst на
sizeof(char *) * sizeof(char *).
Для 32-битной архитектуры это будет 16, для 64-битной - 64. Это совсем не то, что хотелось. Об адресной арифметике смотри, например, у Кернигана и Ритчи в книжке "Язык программирования C" параграф 5.4 "Адресная арифметика", там как раз этот вопрос понятно изложен.

3.
Третья ошибка.

В функции main()

Код:
func(k,string[0],string[1],string[2]);
после k указано всего 3 параметра, k - как раз число параметров. Почему оно произвольно? Если k окажется не равным трем, это приведет к выходу за границы переданных параметров, считыванию в качестве указателя строки каких-то данных, не являющихся им и дальнейшим непредсказуемым действиям. k должно быть равно строго 3.
Поэтому имеем
Код:
func(3,string[0],string[1],string[2]);
Далее.
В тексте программы в main() встречается строка
scanf("%s",&string[i]);
Символ & перед string по-моему лишний, string[i] все равно адрес.
Я бы записал просто
Код:
scanf("%s",string[i]);

Последний раз редактировалось Matematic; 04.11.2012 в 09:50
Ответить с цитированием
  (#5 (permalink)) Старый
Matematic Matematic вне форума
Member
 
Аватар для Matematic
 
Сообщений: 388
Сказал(а) спасибо: 31
Поблагодарили 8 раз(а) в 8 сообщениях
Регистрация: 15.01.2007
По умолчанию 04.11.2012, 09:07

Итого имеем

c Код:
#include<stdio.h>
#include<conio.h>
#define N 10
#define M 31

void reverse(char *str)
{
    char *end;
    char temp;

    for(end=str;*end!='\0';end++)
        ;

    end--;

    while(str<end){
        temp=*str;
        *str=*end;
        *end=temp;
        str++;end--;
    }
}

void func(int k,char* st1,...)
{
    int i=1;
    char* *pst=&st1;
    do{
        reverse(*pst);
        puts(*pst);
        i++;
        pst++;
    }while(i<=k);
}

int main(void)
{   int i;
     char string[N][M];

     puts("\nEnter 3 strings:\n");

    for(i=0;i<3;i++){
        printf("%d)",i+1);
        scanf("%s",string[i]);
    }

    func(3,string[0],string[1],string[2]);

    getch();
    return 0;
}

У меня заработала.

Последний раз редактировалось Matematic; 04.11.2012 в 09:13
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
5neverthesame94 5neverthesame94 вне форума
Member
 
Сообщений: 18
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 19.02.2012
По умолчанию 04.11.2012, 12:38

Спасибо ) Работает)
Ответить с цитированием
  (#7 (permalink)) Старый
Matematic Matematic вне форума
Member
 
Аватар для Matematic
 
Сообщений: 388
Сказал(а) спасибо: 31
Поблагодарили 8 раз(а) в 8 сообщениях
Регистрация: 15.01.2007
По умолчанию 04.11.2012, 23:10

)
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите исправить ошибку onliner PHP 2 21.08.2013 09:18
помогите исправить ошибку julia9311 Вопросы начинающих программистов 0 01.07.2012 03:50
Помогите пожалуйста исправить ошибку!!(( Классы и Объекты в С++ Дамболби Вопросы начинающих программистов 1 23.05.2012 00:22
Помогите исправить ошибку Safer54rus Prolog 9 28.12.2011 19:43
помогите исправить единственную ошибку в процедуре оьработки tanuha_smile Pascal 0 23.02.2011 16:22
Помогите исправить ошибку!!! 111 Pascal 0 16.01.2011 21:56
помогите исправить ошибку salwator Pascal 1 23.12.2010 11:10
Выводит ошибку Помогите исправить! Ikrsk Prolog 5 17.12.2010 18:14
помогите исправить ошибку IIITAK Prolog 5 27.06.2008 16:11
помогите исправить ошибку IIITAK Prolog 1 11.06.2008 23:11
Помогите исправить ошибку (( BadGirl Pascal 2 25.04.2008 18:13
Помогите исправить маленькую ошибку в программе 7apostol7 Prolog 1 15.11.2007 21:41



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов