Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2012, 08:01   #1
srs6270
Новичок
Джуниор
 
Регистрация: 22.03.2012
Сообщений: 3
По умолчанию Ошибка сегментации

Здравствуйте,

дали задание написать код, который читает файл и затем записывает данные в буфер. Вроде написал, но не работает. Выяснил, что имеет место быть "ошибка сегментации". Попытки найти в Интернете дельный ответ увенчались провалом. Прошу вас помочь разобраться с кодом, ибо сам я в Си не особо силен.


Код:
#include <stdio.h> 
#include <string.h> 
#include <limits.h> 
 
int main(int argc, char *argv[]) { 
 
  FILE *fp; 
  char filename[128]; 
  char strings[USHRT_MAX][80]; 
  unsigned short cnt = 0; 
 
  strcpy(filename, argv[1]); 
 
  fp = fopen (filename, "r"); 
  if (fp == NULL) { 
    perror("Unable to open file: "); 
    return(-1); 
  } 
 
  while (fscanf(fp, "%s", strings[cnt++] ) != EOF); 
   
  fclose(fp); 
 
  return(0); 
}
srs6270 вне форума Ответить с цитированием
Старый 22.03.2012, 11:25   #2
S1av0k
Пользователь
 
Регистрация: 26.11.2009
Сообщений: 87
По умолчанию

Зачем в используете это:
Код:
strcpy(filename, argv[1]);
?
Помог - жми весы
S1av0k вне форума Ответить с цитированием
Старый 22.03.2012, 15:47   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Он передаёт имя файла параметром при запуске. Ничуть, правда, не заботясь при этом о проверке длины имени...
...
Автор, массив на пять метров со стека снял бы, что-ли?..
Vago вне форума Ответить с цитированием
Старый 22.03.2012, 17:35   #4
srs6270
Новичок
Джуниор
 
Регистрация: 22.03.2012
Сообщений: 3
По умолчанию

S1av0k, этот код:
Код:
strcpy(filename, argv[1]);
мне подсказали, но истинного значения не понимаю. Знаю, что он копирует аргумент в файл и все. Можно по другому сделать?
Vago, так лучше будет?
Код:
if(strlen(filename)>128)
{
printf("Filename is too long");
exit(0);
}
srs6270 вне форума Ответить с цитированием
Старый 22.03.2012, 17:48   #5
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Ну да. Ну да... Сперва скопировали (возможно выйдя за пределы зарезервированной размерности), а потом проверяем длину!..

Гавная причина, по-прежнему, не в этом. Декларацию массива strings[USHRT_MAX][80] ЗА тело ф-ии вынеси, пожалуйста.

С типами памяти разберись. Си - это почти машинный язык. Нельзя на нём программировать и ничего при этом не знать об архитектуре машины (ох, пардон, компьютера).
Vago вне форума Ответить с цитированием
Старый 23.03.2012, 04:55   #6
srs6270
Новичок
Джуниор
 
Регистрация: 22.03.2012
Сообщений: 3
По умолчанию

Vago, спасибо за наводку, почитаю и постараюсь понять.
srs6270 вне форума Ответить с цитированием
Старый 15.07.2012, 23:34   #7
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Доброго времени суток!

Не хочу создавать новую тему, поэтому пишу в этой. В ощем, уже несолько дней меня занимет одна проблема, причину которой я не могу обнаружить...

Итак, есть геттер класса CTTetromino (возвращает указатель на массив, TetroMap сам по себе и есть указатель на этот массив):
Код:
unsigned char*  CTTetromino::GetArray ( ) const
{
	return TetroMap;
}
Указатель на созданный статический объект этого класса (класса CTTetromino) передается в кач-ве аргумента в функцию (член-метод другого класса, однако, это не принципиально):
Код:
void CTGlass::PutTetroInTheGlass ( CTTetromino* Tetro )
Вот тело функции целиком:
Код:
void CTGlass::PutTetroInTheGlass ( CTTetromino* Tetro )
{
	unsigned char* TetroArray;

	int TetroX, TetroY;

	int X, Y;

	int i, j;

	int Tester;

	TetroArray = Tetro->GetArray ( );

	TetroX = Tetro->GetTetroMapX ( );
	TetroY = Tetro->GetTetroMapY ( );

	X = Tetro->GetPositionX ( );
	Y = Tetro->GetPositionY ( );

    for ( i = 0; i < TetroY; i++ )
    {
        for ( j = 0; j < TetroX; j++ )
        {
            //*( GlassArray + ( i + Y ) * TetroX + ( j + X ) ) = *( TetroArray + i * TetroX + j );
            //*( GlassArray + ( i + Y ) * TetroX + ( j + X ) ) = 0;
            Tester = *( TetroArray );
        }
    }
}
В теле объявляю указатель на массив:
Код:
unsigned char* TetroArray;
И инициализирую его с помощью вышеописанного геттера:
Код:
TetroArray = Tetro->GetArray ( );
Однако, при любой попытке обратиться к TetroArray:
Код:
Tester = *( TetroArray );
получаю ошибку сегментации.


Я просто понятия не имею, где я допустил оплошность... понятия не имею... не могу разобраться. Помогите, пожалуйста, я в тупике.
mmx358 вне форума Ответить с цитированием
Старый 15.07.2012, 23:51   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

покажите инициализацию массива вашего.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 16.07.2012, 11:42   #9
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Находится в конструкторе класса CTTetromino:
Код:
unsigned char* TetroMap;

int i, j; /// Counters for cycles

TetroMapX = ( TetroType == Fig_I ) ? 4 : ( ( TetroType == Fig_O ) ? 4 : 3 );
TetroMapY = ( TetroType == Fig_I ) ? 4 : 3;

TetroMap = ( unsigned char * ) calloc ( TetroMapX * TetroMapY, sizeof ( unsigned char ) );

for ( i = 0; i < TetroMapY; i++ )
for ( j = 0; j < TetroMapX; j++ )
{
    * ( TetroMap + i * TetroMapX + j ) = 0;
}
Вопрос все еще актуален.

Последний раз редактировалось Stilet; 18.07.2012 в 20:16.
mmx358 вне форума Ответить с цитированием
Старый 17.07.2012, 21:57   #10
Hejerdal
Пользователь
 
Регистрация: 03.07.2012
Сообщений: 14
По умолчанию

Ошибка происходит из-за выхода за пределы выделенной памяти. Проверьте, соответствуют ли значения переменных TetroMapX и TetroMapY в момент обращения к памяти в цикле таковым в момент выделения памяти под массив; правильно ли работают геттеры этих переменных. Используйте отладку!
Hejerdal вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Линейные списки. Ошибка сегментации при добавлении элемента. litviak Общие вопросы C/C++ 10 30.10.2011 23:48
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58
Работа с указателями. Ошибка сегментации. agronomchek Помощь студентам 1 24.08.2010 14:51
Ошибка сегментации при вызове system("PAUSE") Lavisa Общие вопросы C/C++ 9 01.08.2009 18:14
Ошибка сегментации при вызове system("PAUSE") Lavisa Помощь студентам 0 29.07.2009 17:43