powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите найти ошибку (segmentation fault)
31 сообщений из 31, показаны все 2 страниц
Помогите найти ошибку (segmentation fault)
    #33138669
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
readBmpHeader(char* fileName){
	FILE *inputFile;
	inputFile = fopen(fileName, "r");
	int b;
	
	fscanf(inputFile, "%d", &b );
	
	printf("%d", b );
	
	fclose(inputFile);
В процессе исполнения выпадает segmentation fault.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33138814
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, это Си такой мерзкий язык, или у меня руки кривые?
Вот этот код работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int is_autorized(){
	//функция проверяет, авторизованна ли программа
	FILE *fp;
	long int key1, key2;
	
	fp = fopen("key", "r");
	fscanf(fp, "%d %d", &key1, &key2);
	printf("%d", key1);
	if (is_key_good(key1, key2) ==  1 )
		return  1 ;
	else
		return  0 ;

}
А вот этот сегментайшин фаулт выдаёт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
main(){
	FILE *fp;
	long int key1, key2;
	
	fp = fopen("1", "r");
	fscanf(fp, "%d %d", &key1, &key2);
	printf("%d, %d", key1, key2);
}
Оба файлика (1 и key) лежат там же где и программа (a.out). До перезагрузки вторая (нерабочая) прога при замене 1 на key выдавала информацию из того файла, который лежит в каталоге первой проги.

ЗЫ: памагите. Я шизонусь с этого языка нахрен.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33138822
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
судя по коду открываются два разных файла. в этом вся загвоздка. В одном есть цифирки в другом нету.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33138877
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это разные проги. И файлики разные. Вот что в них:
key
193023 257364

1
230023 257364
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33138902
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в каком месте вываливается?
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33138946
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовать
0) проверить, что fopen возвращает не NULL

Код: plaintext
1.
2.
3.
4.
if(fp==NULL) 
 {
 puts("\n file not found");
 return;
 }

1) есть ли
Код: plaintext
#include <stdio.h>

2) заменить %d на %ld
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139031
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roman10А в каком месте вываливается?
Расстановка коментариев привела меня к выводу что на fscanf.

Щас попробую то, что Землекоп посоветова. Прикол в том что файл написанный программой прочитался великолепно. А вообще маразм крепчает. Попробовал вот так:
Код: plaintext
1.
2.
key1 = getc(fp);
printf("%d", key1);
Не помогло.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139036
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал. Поимел сообщение об отсутствии файла.
Попробовал полный путь. Всё получилось. Теперь вопрос: почему когда этот файл был выводом такой же проги то полный путь не требовался?
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139038
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не может быть проблемы в crlf?
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139049
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinПопробовал. Поимел сообщение об отсутствии файла.
Попробовал полный путь. Всё получилось. Теперь вопрос: почему когда этот файл был выводом такой же проги то полный путь не требовался?

Попробуй перед именем файла вставить "./" Линух это любит. В принципе, программа может где-нибуть менять текущий каталог.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139069
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что такое crlf?

Щас попробую ./ А вообще я продолжаю офигевать.

Нет. Не продолжаю. Всё заработало.

А вот ./ выдало file not faund. Ну тот самый, который ты добавить прдложил.

ЗЫ: вывих мозга я уже получил:)
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139120
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinА что такое crlf?
CR первод каретки - символ с кодом 13
LF первод строки - символ с кодом 10
Некоторые системы в простых текстовых файлах разделяют строки парой CR+LF, некоторые одиночным LF. Теоретически файл созданый в одной ОС может не правильно читатья в другой. Большинство современных библиотек знает об этом приколе и автоматически подстраивается при чтении, но пишет в родном формате.


SarinА вот ./ выдало file not faund. Ну тот самый, который ты добавить прдложил.
Воспользуйся функцией getcwd() она даст тебе текущий каталог процесса, сравни его с предполагаемым и сделай выводы.

SarinЗЫ: вывих мозга я уже получил:)
На самом деле там все очень просто. Скорее всего намудрил с переменной окружения PATH и запускаешь не тот a.out про который думаешь :)
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139164
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Путь к a.out я прописываю целиком и полностью.

Про crlf понял. Я эту фишку знаю. И знаю что она crlf зовётся. Просто сейчас мозги уже в таком состоянии, что не варят совсем. Думал сегодня хедер БМПшный считаю. А я файл открыть не могу.

Ладно. Продолжим с сегментайшн фаултом воевать. После того как у меня всё получилось в той тестовой проге я начал возится с основной.Вот что там есть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
int readBmpHeader(char* fileName){
	
	FILE *inputFile;
	int b;
	
	inputFile = fopen(fileName, "r");
	if (inputFile == NULL){
		printf("\nФайл %s отсутствует, или программа не может получить к нему доступ.\n", fileName);
		return  1 ;
	}
	
	fscanf(inputFile, "%d", &b);
	printf("%d", b );
	
	fclose(inputFile);
	
}
Эта функция должна будет считывать хедер. Но сейчас она пока что может только меня в ступор вгонять.
Когда меняешь inputFile = fopen(fileName, "r"); на inputFile = fopen("/home/T.bmp", "r");
всё нормально. А если имя файла (тож самое) вводишь в процессе исполнения то получаешь сегментайшн фаулт.

Заранее спасибо всем.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139170
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед fopen поставь
Код: plaintext
printf(fileName);
, что бы посмотреть на имя файла.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139196
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
судя по тому что ты собираешся читать заголовок, тебе нужно делать не "r" а "rb"
сам на таком спотыкнулся очень сильно :-)
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139198
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и не fscanf
а
fread(&b,4,1,inputFile);
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139240
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем r от rb отличается?
И что такое fread? И что это за параметры 4,1?
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139243
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man fread

:-)

rb это чтение бинарного файла.
а просто r - это чтение текстового.
при чтении бинарного никак не интерпретируются всякие crlf и конец файла.

fread(&buf, n, k, file) читает n блоков по k байт из файла file в буффер buf
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139249
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кайфовая какая функция.
А я уже перевёл свой проект в KDevelop. Там дёргал отладчик. Ну ща попробуем. А вообще вот что меня смущает: ведь когда я имя файла текстом в коде задавал он работал.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139258
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinКогда меняешь inputFile = fopen(fileName, "r"); на inputFile = fopen("/home/T.bmp", "r");
А ты при вводе учитываешь регистр букв в имени файла?
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139268
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarinведь когда я имя файла текстом в коде задавал он работал.

Выложи сюда кусок кода, где вводится имя файла. И все будет ясно.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139317
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем большое. rb и fread помогло.

Как допишу исходники сюда кину. Ведь прога GPL. И, наверное, может оказатся полезной. Решаемые задачи не тривиальны.

White OwlА ты при вводе учитываешь регистр букв в имени файла?
Конечно. Ведь в Линухе он учитывается.
ЗемлекопВыложи сюда кусок кода, где вводится имя файла. И все будет ясно.

А я пожалуй то что готово уже прям сейчас покажу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
/***************************************************************************
 *   Copyright (C) 2005 by Mihail Konstantinov                             *
 *   023110@rambler.ru                                                     *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>

// секция типов

typedef struct bmpFileHeader { // bmfh 
    short int bfType; //должено содержать две буковки(B и M) 
    int bfSize;  //Размер файла в байтах
    short int bfReserved1; //зарезервированно
    short int bfReserved2; //зарезервированно
    int bfOffBits; //байтовое смещение до начала изображения (должно быть 54)
} Header_a;

typedef struct bmpInfoHeader{
	unsigned int biSize; //размер заголовка в байтах (должно быть 40)
	int biWidth; //ширина картинки
	int biHeight; // высота картинки
	short int biPlanes; //должно быть 1
	short int biBitCount; //глубина цвета (должно быть 24)
	int biCompression;
	int biSizeImage;
	int biXPelsPerMeter;
	int biYPelsPerMeter; 
	int biClrUsed;
	int biClrImportant;
} Header_b;

typedef struct bmpHeader{
	Header_a File;
	Header_b Info;
} Header;

Header inputFileHeader;
char inputFileName[];

int main(int argc, char *argv[])
{
	
	
	
	printf("Вас приветствует эта чудная прога.\n");
	printf("Введите имя файла для обработки.\n Файл должен быть формата BMP и иметь глубину цвета 24 бита\n");
	
	scanf("%s", inputFileName);
	printf("Файл выбран(%s)", inputFileName);
	readBmpHeader(inputFileName);
	
	printf("\nBmpBufer is done\n");
	fflush(stdout);
	
	
	return  0 ;
}

int readBmpHeader(char* fileName){
	printf("\nНачало функции readBmpHeader\n");
	printf("\nНачало привязки к файлу %s\n", fileName);
	FILE *inputFile;
	short int b;
	printf("\nНачало привязки к файлу %s\n", fileName);
	inputFile = fopen(fileName, "rb");
	if (inputFile == NULL){
		printf("\nФайл %s отсутствует, или программа не может получить к нему доступ.\n", fileName);
		return  1 ;
	}
	
	//Здесь программа считывает ту часть заголовка где хранится информация о файле.
	fread(&inputFileHeader.File.bfType,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfSize,  1 ,  4 , inputFile);
	fread(&inputFileHeader.File.bfReserved1,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfReserved2,  1 ,  2 , inputFile);
	fread(&inputFileHeader.File.bfOffBits,  1 ,  4 , inputFile);
	//а здесь о изображении
	fread(&inputFileHeader.Info.biSize,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biWidth,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biHeight,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biPlanes,  1 ,  2 , inputFile);
	fread(&inputFileHeader.Info.biBitCount,  1 ,  2 , inputFile);
	fread(&inputFileHeader.Info.biCompression,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biSizeImage,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biXPelsPerMeter,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biYPelsPerMeter,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biClrUsed,  1 ,  4 , inputFile);
	fread(&inputFileHeader.Info.biClrImportant,  1 ,  4 , inputFile);
	
	printf("\nРазмер файла (по данным из заголовка): %d\n", inputFileHeader.File.bfSize );
	printf("Смещение на растровое изображение: %d\n", inputFileHeader.File.bfOffBits );
	printf("Размер структуры: %d\n", inputFileHeader.Info.biSize );
	printf("Ширина изображения: %d\n", inputFileHeader.Info.biWidth );
	printf("Высота изображения: %d\n", inputFileHeader.Info.biHeight );
	
	fclose(inputFile);
	
	printf("\nФункция readBmpHeader закончила свою работу. Управление передаётся в основную программу.\n");
}

help(){
	printf("В процессе написания\n");
}
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139319
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
char inputFileName[];

Это страшный косяк. Должно быть char inputFileName[размер];
Из-за него все может рушится.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139326
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда я только начал писать под FreeBSD(читай posix) я тоже начинал программу с лицензии :-)

ни одна из таких программ у меня не заработала, и я понял. Сначало нужно научится писать программы, а потом, уже в написанные, можно вставить лицензию :-)
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139332
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем вот это:
"введите имя файла"?
Это моветон.
как говорит Землекоп "страшный" :-)
в стиле студентов младших курсов захудалых пединститутов :-)

делай хотя бы получение имени файла с аргументов коммандной строки.
например типа так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int main(int argn, char* argc)
{
 if (argn< 2 )
 {
   printf("File name, please!\n");
   return - 1 ;
 };
 FILE* fl=fopen(argc[ 1 ],"rb");
 //bla-bla-bla
}


совсем хорошо еще проверять входной поток :-)
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139367
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kкогда я только начал писать под FreeBSD(читай posix) я тоже начинал программу с лицензии :-)

ни одна из таких программ у меня не заработала, и я понял. Сначало нужно научится писать программы, а потом, уже в написанные, можно вставить лицензию :-)


Прогу с лицензии не я начал. Это автоматом KDevelop добавил:)

Насчёт "Введите имя файла" я знаю что косяк. И делать всё в итоге буду через getopt_long. У меня сначала через него и было. Но он чудил малость. Кстати как читать его оргументы я не знаю пока. И я решил что надо заставить прогу работать сейчас. А не красоту наводить. Конечно всё будет через аргументы.

Ну первое преимущество опен сорса я уже ощутил. Стоило показать код целиком и Землекоп сразу обнаружил ошибку.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139553
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SarinСкажите, это Си такой мерзкий язык, или у меня руки кривые?

С действительно мерзкий. Надо писать на С++.
Но не в этом данном случае.

Sarin
Вот этот код работает:
...
А вот этот сегментайшин фаулт выдаёт:


Во-первых, %d - это ввод и вывод чисел размера sizeof(int).
А у тебя - long. Я не знаю, разной ли они длины у тебя на твоей платформе (Linux, подозреваю), но даже чисто формально это неправильно. Так что надо
добавить в формат спецификатор, определяющий , что число - long.
Это - 'l', т.е должно быть "%ld".

Во-вторых, надо все же проверять , открылся ли файл. Прочитай описание fopen.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33139568
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sarin
* Copyright (C) 2005 by Mihail Konstantinov *

Я таки нипонял. Ты Константинов, или Сарин ?
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33140245
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv Sarin
* Copyright (C) 2005 by Mihail Konstantinov *

Я таки нипонял. Ты Константинов, или Сарин ?
Константинов. Sarin - ник.
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33141182
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_kкогда я только начал писать под FreeBSD(читай posix) я тоже начинал программу с лицензии :-)
ни одна из таких программ у меня не заработала, и я понял. Сначало нужно научится писать программы, а потом, уже в написанные, можно вставить лицензию :-)
5+!!! :)
А на пединституты бочки катить все же не надо! Пед - педу рознь...
...
Рейтинг: 0 / 0
Помогите найти ошибку (segmentation fault)
    #33141716
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:
> А на пединституты бочки катить все же не надо! Пед - педу рознь...

да я сам в педе учился :-)
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите найти ошибку (segmentation fault)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]