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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 15:45   #1
v01d
Пользователь
 
Регистрация: 22.11.2008
Сообщений: 33
По умолчанию Передать указатель на файл функции

Программа со следующим кодом вываливается с ошибкой сегментирования
Код:
#include <stdio.h>

void initFile(FILE *);

int main(void)
{
        FILE *fp;
        initFile(fp);
        fclose(fp);

        return 0;
}

void initFile(FILE *fp)
{
        fp = fopen("data.txt", "r");
}
Компилируется и линкуется в линуксе при помощи c++ тихо; файл data.txt существует с полным доступом. При вызове ф-ции fopen() в ф-ции main() программа работает. Посему считаю, что ошибка из-за неправильно передачи *fp.
v01d вне форума Ответить с цитированием
Старый 22.01.2010, 15:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В Windows твой код работает без ошибок.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2010, 18:42   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от v01d Посмотреть сообщение
Программа со следующим кодом вываливается с ошибкой сегментирования

Компилируется и линкуется в линуксе при помощи c++ тихо; файл data.txt существует с полным доступом. При вызове ф-ции fopen() в ф-ции main() программа работает. Посему считаю, что ошибка из-за неправильно передачи *fp.
думаю это потому что вы пытаетесь закрыть файл по неинициализированному указателю. Нужно так:
Код:
#include <stdio.h>

void initFile(FILE *);

int main(void)
{
        FILE *fp;
        initFile(&fp);
        fclose(fp);

        return 0;
}

void initFile(FILE **fp)
{
        *fp = fopen("data.txt", "r");
}
netrino вне форума Ответить с цитированием
Старый 22.01.2010, 18:52   #4
v01d
Пользователь
 
Регистрация: 22.11.2008
Сообщений: 33
По умолчанию

Да, спасибо, разобрался. Аж стыдно стало.

А почему в виндовсе-то работает?
v01d вне форума Ответить с цитированием
Старый 22.01.2010, 18:56   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от v01d Посмотреть сообщение
Да, спасибо, разобрался. Аж стыдно стало.

А почему в виндовсе-то работает?
У меня и в виндовс не работает
netrino вне форума Ответить с цитированием
Старый 22.01.2010, 19:29   #6
rangerx
Пользователь
 
Регистрация: 30.05.2009
Сообщений: 46
По умолчанию

fp из main и fp параметр функции initFile это разные переменные(!), которые при вызове
Код:
initFile(fp); // fp(параметр функции initFile) = fp(из функции main)
просто начинают указывать на одну и ту же область памяти. С помощью "параметра fp"(в данном случае) можно менять значение того, на что указывает "fp из main", но изменить значение самого "fp из main" невозможно . Т.е., для того чтобы изменить значение обычной переменной используется указатель, а для изменения значения указателя используется указатель на указатель, как и было показано выше )
rangerx вне форума Ответить с цитированием
Старый 01.01.2013, 07:05   #7
den68
 
Регистрация: 05.10.2009
Сообщений: 3
По умолчанию

похожая проблема, делаю вроде как надо.
до кучи, собрал пример приведенный выше netrino:

Код:
 gcc e1.c
e1.c: In function âmainâ:
e1.c:8: warning: passing argument 1 of âinitFileâ from incompatible pointer type
e1.c: At top level:
e1.c:15: error: conflicting types for âinitFileâ
e1.c:3: error: previous declaration of âinitFileâ was here
какие мысли ?

Код:
gcc -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enabl
e-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c+
+,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jr
e --with-cpu=generic --host=i386-redhat-linux
Thread model: posix
gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)
den68 вне форума Ответить с цитированием
Старый 01.01.2013, 07:56   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Код:
#include <stdio.h>

void initFile(FILE *);

int main(void)
{
        FILE *fp;
        initFile(&fp);
        fclose(fp);

        return 0;
}

void initFile(FILE **fp)
{
        *fp = fopen("data.txt", "r");
}

Цитата:
какие мысли ?
Очепятка.
Прототип функции не соответствует реализации.
EUGY вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать параметры функции в ДЛЛ????? Zerone Общие вопросы Delphi 3 01.06.2009 09:27
Есть ли возможность отсорировать масив если передаёш по функции указатель ? HeaD Помощь студентам 2 22.01.2009 09:16
Передать файл клиенту BlackOmen JavaScript, Ajax 7 26.06.2008 11:36
Как передать указатель в процедуру??? kate4ka Общие вопросы Delphi 1 17.03.2008 12:49