выпуск int в g ++ / mysql / redhat - PullRequest
0 голосов
/ 02 апреля 2009

Я давно не писал C и пишу приложение с использованием MySQL C API, компилируя в g ++ на redhat.

Итак, я начинаю выводить некоторые поля с помощью printfs ... используя API оракула, с PRO * C, который я использовал (например, suse, много лет назад), я мог выбрать int и вывести его как:

int some_int;
printf("%i",some_int);

Я пытался сделать это с помощью mysql, и у меня отображалось 8 случайных чисел ... Я думал, что это проблема MySQL API, и некоторые проблемы конфигурации с моим сервером, и я потратил несколько часов, пытаясь это исправить, но не смог и обнаружил, что я могу сделать:

int some_int;
printf("%s",some_int);

, и это будет правильно выводить целое число. Поскольку я не делаю вычисления для извлекаемых значений, я подумал, что это правильное решение.

Пока я не попытался подсчитать некоторые вещи ...

Я сделал простое:

int rowcount;
for([stmt]){
rowcount++;
}
printf("%i",rowcount);

Я снова получаю 8-значное случайное число ... Я не могу понять, как обстоят дела с целыми на этой машине.

тогда я понял, что если я инициализирую int нулем, то получаю правильное число.

Может кто-нибудь объяснить, при каких условиях вам нужно инициализировать переменные int равными нулю? я не помню, чтобы это делалось каждый раз в моей старой кодовой базе, и я не видел этого в примере, в котором я моделировал свой код mysql_stmt из ...

есть что-то, чего мне не хватает? также вполне возможно, что я забыл, что это требуется каждый раз

спасибо ...

Ответы [ 6 ]

1 голос
/ 02 апреля 2009

Вы всегда должны инициализировать свои переменные. Чтобы поймать ошибку такого рода, вам, вероятно, следует скомпилировать -Wall, чтобы получить все предупреждения, которые может выдать g++. Я также предпочитаю использовать -Werror для создания ошибок всех предупреждений, поскольку почти всегда случается так, что предупреждение указывает на ошибку или потенциальную ошибку и что очистка кода лучше, чем оставлять его как есть.

Кроме того, в вашем втором файле printf вы использовали %s, который предназначен для печати строк, а не целых чисел.

int i = 0;
printf("%d\n", i);
// or
printf("%i\n", i);

Это то, что вы хотите.

1 голос
/ 02 апреля 2009

Только глобальные и статические значения будут инициализированы нулем. Переменные в стеке всегда будут содержать значение мусора, если не инициализированы.

int g_var; //This is a global varibale. So, initialized to zero
int main()
{

int s_var = 0; //This is on stack. So, you need to explicitly initialize
static int stat_var;  //This is a static variable,  So, initialized to zero
}
1 голос
/ 02 апреля 2009

Если вы не инициализируете свои переменные, нет гарантии по умолчанию 0 / NULL / любое значение. Некоторые компиляторы МОГУТ инициализировать его 0 для вас (IIRC, MSVC ++ 6.0 было бы достаточно для этого), а другие - нет. Так что не надейся на это. Никогда не используйте переменную, предварительно не присвоив ей какое-либо вменяемое значение.

0 голосов
/ 02 апреля 2009

Неинициализированная переменная.

int some_int = 0;
0 голосов
/ 02 апреля 2009

Вы действительно забыли. В C и C ++ вы не получаете никакой автоматической инициализации; содержимое c после int c; соответствует тому, что происходит по адресу, указанному c в данный момент.

Лучшая практика: инициализировать по определению: int c = 0;.

О, PS, и позаботьтесь о том, чтобы тип MySQL int соответствовал типу C int; Я думаю, что это так, но я не уверен. Однако он будет чувствителен как к архитектуре, так и к компилятору, поскольку sizeof(int) не одинаков во всех средах C.

0 голосов
/ 02 апреля 2009

Переменные не инициализируются автоматически в c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...