Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / fprintf помогите чайнику / 16 сообщений из 16, страница 1 из 1
20.06.2005, 13:49
    #33124592
Tural
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
Человеку не знающему С++ пришлось написать маленькую программу которая должна работать на Soleris-е. Написал. Теперь пришлось там поменять тип int на long. И тут-то возникла проблема. Есть такая строка

fprintf(FILE_OUTPUT, "%i;", i4);

где i4 переменная типа int. Теперь int сделали long. В исходящем файле кроме цифр появился еще какой-то мусор. На что надо менять "%i;" ? Или может мы не там ищем?

До этой строки работает своя функция которая объявлена так

int CompConv(unsigned char *c, long size)

Результат этой функции присваивается i4. После замены int на long выходит warning:
pp.c:402: warning: type mismatch with previous implicit declaration
pp.c:291: warning: previous implicit declaration of `CompConv'
pp.c:402: warning: `CompConv' was previously implicitly declared to return `int'

вернули int. Переменная которая присваивается результату этой функции имеет тип long. Что будет если эта переменная будет больше чем int, ведь функция имеет тип int. Почему выходит warning и нужно ли игнорировать его и поставить тип функции long.
...
Рейтинг: 0 / 0
20.06.2005, 14:02
    #33124633
MLeon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
%i -> %li
В предварительном объявлении функции исправить тип в соответствии с определением.
...
Рейтинг: 0 / 0
20.06.2005, 14:21
    #33124693
Tural
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
Сори. Не понял. В каком это предварительном объявлении? Где это объявление находится?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int isxobmes()
{
  long i4;
  c =(unsigned char *)malloc( 100 );

  while(fread(c, 1 , 2 ,FILE_INPUT) >  0 )
  {
    i4 = CompConv(c,  2 );                  //строка 291
    fprintf(FILE_OUTPUT, "%li;", i4);
    ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int CompConv(unsigned char *c, long size)
{                                                             //строка 402
   long i, k;
   long r= 0 ;
   ...
   return r;
}
...
Рейтинг: 0 / 0
20.06.2005, 14:32
    #33124734
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
TuralСори. Не понял. В каком это предварительном объявлении? Где это объявление находится?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int isxobmes()
{
  long i4;
  c =(unsigned char *)malloc( 100 );

  while(fread(c, 1 , 2 ,FILE_INPUT) >  0 )
  {
    i4 = CompConv(c,  2 );                  //строка 291
    fprintf(FILE_OUTPUT, "%li;", i4);
    ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int CompConv(unsigned char *c, long size)
{                                                             //строка 402
   long i, k;
   long r= 0 ;
   ...
   return r;
}



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int CompConv(unsigned char *c, long size) //Здесь поменяй int на long!!!
{                                                             //строка 402
   long i, k;
   long r= 0 ;
   ...
   return r;
}
...
Рейтинг: 0 / 0
20.06.2005, 14:45
    #33124777
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
long CompConv(unsigned char *c, long size);


int isxobmes()
{
  long i4;
  c =(unsigned char *)malloc( 100 );

  while(fread(c, 1 , 2 ,FILE_INPUT) >  0 )
  {
    i4 = CompConv(c,  2 );                  //строка 291
    fprintf(FILE_OUTPUT, "%li;", i4);
    ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
long CompConv(unsigned char *c, long size)
{                                                             //строка 402
   long i, k;
   long r= 0 ;
   ...
   return r;
}
...
Рейтинг: 0 / 0
20.06.2005, 14:46
    #33124783
Tural
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
Станислав C.
тык warning выходит при замене int на long именно там. А если там оставить int то не выходит.
...
Рейтинг: 0 / 0
20.06.2005, 18:39
    #33125396
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
Функции использующиеся в разных модулях еще объявляют в заголовочных файлах
"чего-то.h". Шарься по каталогам своей программы и смотри все *.h в одном из них будет запись:
Код: plaintext
1.
int CompConv(unsigned char *c, long size);
Эта же запись может быть и где-то в начале исходника или даже повторена в нескольких исходниках (в *.c или *.cpp). Искать и исправлять все копии.
...
Рейтинг: 0 / 0
22.06.2005, 13:38
    #33128806
Tural
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
Посмотрел MSDN по VC++ и увидел что там тип long и int32 одинакового размера - 4 байта. Я думал лонг 8 байт. Но видимо ошибся. На С под солярис тоже так? Если да то я хочу заменить лонг на 8-и байтовое число. На VC++ это int64. А как на С под солярис? Там я написал вместо long int64 но компилятор выдает ошибку.
pp.c:87: `int64' undeclared (first use in this function)
Как объявить переменную, что бы она была 8-и байтовым целым числом?

Кстати проблема с мусором решена. Проблема была в другом. Но вот теперь осталась проблема, которую я выше описал. Еще тот, кто написал программу сказал, что никакого файла *.h нет. Я тоже смотрел и не нашел. Выше тоже ничего не описано. Странно, почему она выдает такой варнинг?...
...
Рейтинг: 0 / 0
22.06.2005, 14:04
    #33128921
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
int64_t
...
Рейтинг: 0 / 0
22.06.2005, 14:15
    #33128960
Tural
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
не получилось
pp.c:87: `int64_t' undeclared (first use in this function)
...
Рейтинг: 0 / 0
22.06.2005, 14:19
    #33128991
nik_x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
#include <stdint.h>
...
...
Рейтинг: 0 / 0
22.06.2005, 14:40
    #33129047
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
TuralПосмотрел MSDN по VC++ и увидел что там тип long и int32 одинакового размера - 4 байта. Я думал лонг 8 байт. Но видимо ошибся. На С под солярис тоже так? Если да то я хочу заменить лонг на 8-и байтовое число. На VC++ это int64. А как на С под солярис? Там я написал вместо long int64 но компилятор выдает ошибку.
pp.c:87: `int64' undeclared (first use in this function)
Как объявить переменную, что бы она была 8-и байтовым целым числом?

Кстати проблема с мусором решена. Проблема была в другом. Но вот теперь осталась проблема, которую я выше описал. Еще тот, кто написал программу сказал, что никакого файла *.h нет. Я тоже смотрел и не нашел. Выше тоже ничего не описано. Странно, почему она выдает такой варнинг?...
Не знаю про Солярис, но в моем Gentus Linux это так (long = 4 байт);
8 бит предоставляет тип long long...
И вообще, посмотрите для начала файл limits.h (найдите через поиск), там все написано...
...
Рейтинг: 0 / 0
22.06.2005, 19:06
    #33129864
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
TuralЕще тот, кто написал программу сказал, что никакого файла *.h нет. Я тоже смотрел и не нашел. Выше тоже ничего не описано. Странно, почему она выдает такой варнинг?...
Есть еще такой момент. Если нету предобъявления функции вообще, то компилятор попытается догадаться как эта функция будет объявлена. Делает он это по первому использованию функции, а когда доходит до собственно объявления и оно не совпадает с предположеным - ругается. "Предположительное" объявление всегда возвращает int, в принципе это может различаться в разных компиляторах, но я иного не встречал. Например такой код 100% даст предупреждение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
viod foo1() {
  long a;
  a = foo2("12345");
}

long foo2(char *s) {
  return atol(s);
}
Лечится очень просто, добавляешь в начало файла строку
long foo2(char *s);
и все.
...
Рейтинг: 0 / 0
22.06.2005, 19:15
    #33129880
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
White OwlЛечится очень просто, добавляешь в начало файла строку
long foo2(char *s);
и все.

Я об этом выше уже писал, но не читают

клик
...
Рейтинг: 0 / 0
22.06.2005, 19:39
    #33129906
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
ЗемлекопЯ об этом выше уже писал, но не читают
А ты свой пример прокоментировал? Вооот! :)
...
Рейтинг: 0 / 0
22.06.2005, 19:48
    #33129916
Землекоп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
fprintf помогите чайнику
White Owl ЗемлекопЯ об этом выше уже писал, но не читают
А ты свой пример прокоментировал? Вооот! :)

Да я без претензий на изобретение велосипеда.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / fprintf помогите чайнику / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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