Гость Опубликовано 2 августа, 2002 Жалоба Поделиться Опубликовано 2 августа, 2002 Короче так. В хэдере объявлена структура, в которой имеется 4 поля: 3 целых числа и один указатель на действительное (типа массив будет из даблов). typedef struct{ INT4 p1; INT4 p2; INT4 p3; DOUBLE *coor; } NM, *pNM; Не смотрите на то, что типы написаны большими буквами - это макросы. Далее делаем статическую переменную типа этой структуры. static NM newS; После этого присваиваем newS.coor = NULL; и заново аллоцируем массив размером р1*р2*р3 (типа realloc). После этого в одной из процедур обработки этой структуры (передается указатель на нее) происходит следующее: имеется 3 вложенных цикла до р1, р2 и р3 соответственно. Внутри самого глубокого цикла происходит хитрое обращение к массиву: for(i=0; i for(j=0; j for (k=0; k pnewS->coor[(i*p2 + j)*p3 + k] = 0; //ноль - для примера } } } Так вот тут-то и начинается самое интересное - выдает такое Segmentation fault. Я пробовал выносить вычисление индекса в отдельную переменную и она все равно ругается. Если же написать просто число (например, 0 или 1), то все ок. Указатель не НУЛЛ. Аллоцируется вроде нормально, иначе указатель бы был нулл. Чего делать не могу понять - я такого ни разу не видел. Причем, косячит именно эта строка - если ее закомментарить, то все ок. НИД ХЕЛП! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 2 августа, 2002 Жалоба Поделиться Опубликовано 2 августа, 2002 typedef struct{ int p1; int p2; int p3; double *coor; } NM, *pNM; static NM newS; static int p1 = 2; static int p2 = 2; static int p3 = 2; int proc ( pNM pnewS ) { int i,j,k; for ( i = 0; i < p1; i++ ) for ( j = 0; j < p2; j++ ) for ( k = 0; k < p3; k++ ) pnewS->coor[(i*p2 + j)*p3 + k] = 0; return 0; } int main ( void ) { newS.coor = 0; newS.coor = ( double* ) malloc ( p1 * p2 * p3 ); proc ( &newS ); free ( newS.coor ); return 0; } Вот этот код отработал на ура.Можь я тя не правильно понял.. А вообще сегфолты обычно вылетают при некорректной работе с памятью...Что за макросы у тя в структе ? И желательно какой точный код проги..Удачи! > Короче так. В хэдере объявлена структура, в которой имеется 4 > поля: 3 целых числа и один указатель на действительное (типа > массив будет из даблов). > typedef struct{ > INT4 p1; > INT4 p2; > INT4 p3; > DOUBLE *coor; > } NM, *pNM; > Не смотрите на то, что типы написаны большими буквами - это > макросы. > Далее делаем статическую переменную типа этой структуры. > > static NM newS; > > После этого присваиваем newS.coor = NULL; и заново аллоцируем > массив размером р1*р2*р3 (типа realloc). > > После этого в одной из процедур обработки этой структуры > (передается указатель на нее) происходит следующее: имеется 3 > вложенных цикла до р1, р2 и р3 соответственно. Внутри самого > глубокого цикла происходит хитрое обращение к массиву: > > for(i=0; i > for(j=0; j > for (k=0; k > pnewS->coor[(i*p2 + j)*p3 + k] = 0; //ноль - для примера > } > } > } > > Так вот тут-то и начинается самое интересное - выдает такое > Segmentation fault. > > Я пробовал выносить вычисление индекса в отдельную переменную > и она все равно ругается. Если же написать просто число > (например, 0 или 1), то все ок. Указатель не НУЛЛ. > Аллоцируется вроде нормально, иначе указатель бы был нулл. > Чего делать не могу понять - я такого ни разу не видел. > Причем, косячит именно эта строка - если ее закомментарить, > то все ок. НИД ХЕЛП! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 2 августа, 2002 Жалоба Поделиться Опубликовано 2 августа, 2002 А что, трудно под отладчиком посмотреть значения переменных в момент падения? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 2 августа, 2002 Жалоба Поделиться Опубликовано 2 августа, 2002 во всяком случае? код который отработал на ура, отработал на ура очень случайно -- нужно писать malloc( p1 * p2 * p3 * sizeof( double ) ); Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 3 августа, 2002 Жалоба Поделиться Опубликовано 3 августа, 2002 Гы-гы )) Точно! Не заметил, извиняюсь...dilmah писал(а): Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.