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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2012, 18:44   #1
demoniqus
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 12
По умолчанию Ошибка при попытке компиляции

Я вот решил попытать счастья на поприще языка С.
Установил у себя Codeblocks и решил опробовать простенький пример из книжки.
Код:
#include <stdio.h>
int main() {
    printf("Content-type: text/html\n\n");
printf("this is <b>file</b> script.cgi\n");
char *QueryString = getenv("QUERY_STRING");
printf("Your data is %s \n", QueryString);
}
Все точно, как в книжке.
Но компилятор выдает предупреждение: при инициализации целое преобразуется в указатель без приведения типов [включена по умолчанию]
В чем может быть проблема?
Если я QueryString объявляю не как указатель и вывожу на печать как число (%i), то ошибок не возникает...
Быть может какая-то веселая настройка среды разработки?
demoniqus вне форума Ответить с цитированием
Старый 13.04.2012, 18:54   #2
Парсифаль
Форумчанин
 
Аватар для Парсифаль
 
Регистрация: 28.04.2009
Сообщений: 186
По умолчанию

В последней строчке Вы указываете
Код:
printf("Your data is %s \n", QueryString)
. QueryString - это указатель, т.е. число. А Вы хотите вывести символ. Для этого нужно разыменовать. И вставить *
Код:
printf("Your data is %s \n", *QueryString)
Ruft ihm es zu durch alle Land', Der durch dies Wunder Gnade fand!
Hoch uber aller Welt ist Gott, Und Sein Erbarmen ist kein Spott
Парсифаль вне форума Ответить с цитированием
Старый 13.04.2012, 19:26   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2 Парсифаль
Отсыпь немного
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 13.04.2012, 19:38   #4
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2 Парсифаль
Отсыпь немного
"Заслуженный модератор"

Охуеть - это еще не то слово.
zotox вне форума Ответить с цитированием
Старый 13.04.2012, 21:34   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2zotox
а как бы ты отреагировал на бред наркомана? а вот за мат страйк тебе выпишу
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 13.04.2012, 22:54   #6
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Вообще там перед этим warning'ом должен быть ещё "implicit declaration of function 'getenv'", который как бы намекает...
Somebody вне форума Ответить с цитированием
Старый 14.04.2012, 08:53   #7
demoniqus
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Парсифаль Посмотреть сообщение
В последней строчке Вы указываете
Код:
printf("Your data is %s \n", QueryString)
. QueryString - это указатель, т.е. число. А Вы хотите вывести символ. Для этого нужно разыменовать. И вставить *
Код:
printf("Your data is %s \n", *QueryString)
Такой вариант не прокатывает...
Похоже немного разобрался - вероятно getenv возвращает не указатель на переменную окружения, а ее значение.
Я переписал вот так:
Код:
 
#include <stdio.h>
int main() {
    printf("Content-type: text/html\n\n");
printf("this is <b>file</b> script.cgi\n");
//char *QueryString;
char QueryString = getenv("QUERY_STRING");
printf("Your data is %s \n", getenv("QUERY_STRING"));
printf("Your data is %s \n", QueryString);
}
и программа запустилась. Вывелось null для обоих выводов в консоли, т.к. переменная окружения в данный момент не определена. Но в составе сайта в качестве cgi вылетает ошибка (может это виндовый глюк?):
Цитата:
<?xml version="1.0" encoding="UTF-16"?>
<DATABASE>
<EXE NAME="first.cgi" FILTER="GRABMI_FILTER_PRIVACY">
</EXE>
<EXE NAME="msvcrt.dll" FILTER="GRABMI_FILTER_THISFILEONLY" >
<MATCHING_FILE NAME="msvcrt.dll" SIZE="343040" CHECKSUM="0x40C272ED" BIN_FILE_VERSION="7.0.2600.5512" BIN_PRODUCT_VERSION="6.1.8638.5512" PRODUCT_VERSION="7.0.2600.5512" FILE_DESCRIPTION="Windows NT CRT DLL" COMPANY_NAME="Microsoft Corporation" PRODUCT_NAME="Microsoft® Windows® Operating System" FILE_VERSION="7.0.2600.5512 (xpsp.080413-2111)" ORIGINAL_FILENAME="msvcrt.dll" INTERNAL_NAME="msvcrt.dll" LEGAL_COPYRIGHT="© Microsoft Corporation. All rights reserved." VERFILEDATEHI="0x0" VERFILEDATELO="0x0" VERFILEOS="0x40004" VERFILETYPE="0x1" MODULE_TYPE="WIN32" PE_CHECKSUM="0x559BE" LINKER_VERSION="0x50001" UPTO_BIN_FILE_VERSION="7.0.2600.551 2" UPTO_BIN_PRODUCT_VERSION="6.1.8638. 5512" LINK_DATE="04/14/2008 16:12:11" UPTO_LINK_DATE="04/14/2008 16:12:11" VER_LANGUAGE="Английский (США) [0x409]" />
</EXE>
<EXE NAME="kernel32.dll" FILTER="GRABMI_FILTER_THISFILEONLY" >
<MATCHING_FILE NAME="kernel32.dll" SIZE="995840" CHECKSUM="0xC3003E57" BIN_FILE_VERSION="5.1.2600.5781" BIN_PRODUCT_VERSION="5.1.2600.5781" PRODUCT_VERSION="5.1.2600.5781" FILE_DESCRIPTION="Библиотека клиента Windows NT BASE API" COMPANY_NAME="Корпорация Майкрософт" PRODUCT_NAME="Операционная система Microsoft® Windows®" FILE_VERSION="5.1.2600.5781 (xpsp_sp3_gdr.090321-1317)" ORIGINAL_FILENAME="kernel32" INTERNAL_NAME="kernel32" LEGAL_COPYRIGHT="© Корпорация Майкрософт. Все права защищены." VERFILEDATEHI="0x0" VERFILEDATELO="0x0" VERFILEOS="0x40004" VERFILETYPE="0x2" MODULE_TYPE="WIN32" PE_CHECKSUM="0xF731E" LINKER_VERSION="0x50001" UPTO_BIN_FILE_VERSION="5.1.2600.578 1" UPTO_BIN_PRODUCT_VERSION="5.1.2600. 5781" LINK_DATE="03/21/2009 14:09:06" UPTO_LINK_DATE="03/21/2009 14:09:06" VER_LANGUAGE="Русский [0x419]" />
</EXE>
</DATABASE>
При этом вывод непосредственно из getenv отрабатывает нормально, а вывод из переменной QueryString дает ошибку и не дает значения. Я поставил &QueryString - в консоли для данного вывода значение стало пустышкой (не null), а в составе сайта ошибка исчезла
А сделав *&QueryString, все вернулось на круги своя: в консоли значение null, а на сайте ошибка.

Цитата:
Сообщение от Somebody Посмотреть сообщение
Вообще там перед этим warning'ом должен быть ещё "implicit declaration of function 'getenv'", который как бы намекает...
Да молчит он, как рыба об лед... никаких намеков, ни грязных, ни похабных с его стороны)))))))
demoniqus вне форума Ответить с цитированием
Старый 15.04.2012, 02:23   #8
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

вылет возможен из-за того что вы пытаетесь вывести char как %s, и вообще как вам удалось присвоить char-ке char *.

Код:
	char * s = getenv("path");
	printf("%s",s);
все работает.
onewho вне форума Ответить с цитированием
Старый 15.04.2012, 02:30   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Как сказали выше, нужно подключить stdlib.h для функции getenv. Функции, которые не имеют прототипа с указанными типами, предполагаются возвращающими тип int, из-за чего и выдаётся предупреждение.
Код:
#include <stdlib.h>
#include <stdio.h>
...
netrino вне форума Ответить с цитированием
Старый 15.04.2012, 08:20   #10
demoniqus
Пользователь
 
Регистрация: 13.04.2012
Сообщений: 12
По умолчанию

Цитата:
Сообщение от onewho Посмотреть сообщение
вылет возможен из-за того что вы пытаетесь вывести char как %s, и вообще как вам удалось присвоить char-ке char *.

Код:
	char * s = getenv("path");
	printf("%s",s);
все работает.
Я бы задал такой же вопрос автору книжки... Но этот хотя бы только про один файл, который надо подключить, забыл... я видел и другие книжки, где автор в данной программе вообще ни одного файла не подключал. Вот так и приходится учиться, обнаруживая и исправляя ошибки в умных книжках, созданных, чтобы учить других уму-разуму...))))

Цитата:
Сообщение от netrino Посмотреть сообщение
Как сказали выше, нужно подключить stdlib.h для функции getenv. Функции, которые не имеют прототипа с указанными типами, предполагаются возвращающими тип int, из-за чего и выдаётся предупреждение.
Код:
#include <stdlib.h>
#include <stdio.h>
...
Спасибо, помогло! А можете назвать имена и других файлов, которые содержат наиболее часто используемые функции и которых следует помнить (возможно это касается каких-то математических, строковых, графических функций, функций работы с массивами)?

Последний раз редактировалось demoniqus; 15.04.2012 в 08:22. Причина: уточнение вопроса
demoniqus вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка при попытке билда в masm'e nuevegramodelamor Помощь студентам 2 24.01.2011 19:45
Ошибка при попытке повторного открытии окна ssdm Общие вопросы по Java, Java SE, Kotlin 0 25.01.2010 19:41
ошибка при попытке запустить программу Fellot Общие вопросы Delphi 3 23.04.2009 21:23
Ошибка при попытке вывода полей из таблицы в ORACLE older Общие вопросы Delphi 2 04.06.2008 17:26
ошибка VBA при попытке использовать свойство или метод chanchikela Microsoft Office Access 0 26.03.2008 23:17