Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Mac и я. C/Objective-C/C++. Ошибки сигментирования


Автор: grisWall 21.5.2013, 16:56
Доброго всем времени суток. Приобрел себе Mac и решил изучить Objective-C чтобы писать программки, и на одном примере завис конкретно.....

Собственно в чем проблема то, в том что при выполнении этого кода, напишу в Си так как он и в Си не исполняется, но IDE при написании ошибку не выдает
толко при выполнении. Ошибкой вот какая: 

Код

0x7fff8e14ce27:  movq   104(%r15), %rax                             <EXC_BAD_ACCESS (code=1, address=0x68)


а вот и сам код:

Код

#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[]){
FILE * wordFile = fopen("../words.txt", "r");
char word[100];

while(fgets(word, 100, wordFile)){   //  эта ошибка указывает на функцию fgets  <EXC_BAD_ACCESS (code=1, address=0x68)
word[strlen(word)-1] = '\0';
printf("%s состоит из %zd строк\n", word, strlen(word));
}
fclose(wordFile);

return 0;
}//main


если кто знаком с Xcode в Mac и встречался с подобным, буду вам благодарен при много.

За ранее Спасибо всем, кто откликнется.

Автор: Result 21.5.2013, 20:03
Попробуй проверить, что wordFile != NULL

Автор: bsa 21.5.2013, 20:59
Код
word[strlen(word)-1] = '\0';
здесь надо заменить strlen(word) на sizeof(word) или на 100. Так как в данный момент strlen может выйти за пределы массива. Именно для предотвращения этого и нужна запись нулевого символа.

Автор: grisWall 21.5.2013, 22:43
Цитата(bsa @  21.5.2013,  20:59 Найти цитируемый пост)

Код

word[strlen(word)-1] = '\0';

здесь надо заменить strlen(word) на sizeof(word) или на 100. Так как в данный момент strlen может выйти за пределы массива. Именно для предотвращения этого и нужна запись нулевого символа. 


в том то и дело, что он до этой точки не доход обрывается во время проверки условия цикла


Цитата(Result @  21.5.2013,  20:03 Найти цитируемый пост)
Попробуй проверить, что wordFile != NULL 


да точно, спасибо, я проверил вот таким условием
Код

if ( wordFile != NULL ) printf("True\n");
else {
printf("False\n");
return 0;
}


и он выдал False и завершился. Значит что-то с файлом, или с функцией fopen 
или путь не распознается, но я и здесь (./words.txt) хранить пробовал и даже в (/tmp/words.txt) все равно не работает

а может быть, изо кодировки? я уже не знаю скорее всего это что-то с  fopen  только я читал про его в stdio.h все с ним вроде бы нормально. Вообще не знаю что там в этом Xcode намешали, только эта прога у меня на linux работает на ура и даже ошибок не выдает.... а тут не хочет я не знаю че делать, а gcc из консоли вызвать, так его вообще в системе нет только через это не нормальное IDE приходится ваще бред.  Кто знает как решить отпишите плиз.

Автор: volatile 22.5.2013, 00:15
Цитата(grisWall @  21.5.2013,  22:43 Найти цитируемый пост)
Кто знает как решить отпишите плиз

Ваша программа знает.

Цитата(grisWall @  21.5.2013,  16:56 Найти цитируемый пост)
FILE * wordFile = fopen("../words.txt", "r");
if (!wordFile) printf("error: %u\n", errno);

Далее, по документации, смотрите что означает сия ошибка.

Если просветления все еще не настало, то постите сюда ваши изыскания

Автор: grisWall 22.5.2013, 08:49
Цитата(volatile @  22.5.2013,  00:15 Найти цитируемый пост)
Цитата(grisWall @  21.5.2013,  16:56 )
FILE * wordFile = fopen("../words.txt", "r");
if (!wordFile) printf("error: %u\n", errno);

Далее, по документации, смотрите что означает сия ошибка.

Если просветления все еще не настало, то постите сюда ваши изыскания 


да я проделал и мне выдало error: 22

а что это значит я и в душе не знаю....не подскажете где это глянуть

Автор: Result 22.5.2013, 14:17
В errno.h
Код

#define EINVAL        22        /* Invalid argument */


далее гугол smile

Автор: volatile 22.5.2013, 16:31
Цитата(grisWall @  22.5.2013,  08:49 Найти цитируемый пост)
а что это значит я и в душе не знаю....


вот так выдаст словесное описание.
Код

#include <string.h> 
...
if (!wordFile) printf("error: %s\n", strerror (errno));


да еще, попробуйте задать абсолютный путь к файлу "/Users/User/тра-ля-ля/words.txt"

Автор: grisWall 24.5.2013, 03:17
все уже перепробовал ни че не помогает короче ну его. Мне кажется, что это какой-то баг в IDE(Xcode Mac-овской) с fopen, или же с кодировкой что-то не то.
Но в любом случае, всем кто откликнулся большое человеческое, многое узнал, пока разбирался. Если кто еще знает, что может быть, или сталкивался с такой проблемой и знает решение, с удовольствием выслушаю, и буду признателен до предела, спасибо всем. Но в общем-то Objectiv-C фуфло полное, ну по крайней мере, мне так показалось, может быть рано судить о языке, встретив первый баг и не изучив его полностью, но мне как то больше привычнее C++. На мой взгляд, он более практичнее и эффективнее в решении конкретных задач, но в качестве эксперимента решил попробовать, и вот на тебе напоролся так сказать на мину. Да и синтаксис у него более изящный и логичный, короче удобно и все. Хотя я не сразу к нему тоже привыкал. Но сейчас уже, не променяю его на какой-то там Objective. 

Автор: bsa 24.5.2013, 15:37
grisWall, скорее всего, ты неправильный путь к файлу указал.
Кстати, твой код написан на C. Как ты можешь делать выводы о Objective-C, когда им даже не пользовался?

Автор: vcgraf 9.10.2013, 06:36
У меня и не только у меня (и судя по англоязычным форумам), возникли те же проблемы с этим кодом программы из книги "Objective-C 2.0 и программирование для Мас" М. Далримпла и С. Кнастера. Это, по-видимому, проблема с авторским  файлом, который идет вместе с примером программного кода. Я сделал свой текстовый файл в редакторе TextWrangler и прописал путь к нему в окне настроек XCode 5.0, который открывается из пунктов меню Product->Scheme->Edit Scheme Путь вводится во вкладке Arguments: раздел Arguments Passed On Launch (нажать "+" для того, чтобы появилось поле для ввода). После этого программа стала работать.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)