LINUX.ORG.RU

Си


2

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

int main(int argc, char *argv[]) {

char *num = «5555»; 	
	
	if (argc != 2) {
	printf(«No param\n»);
		exit(0);
	}
	
	if (argv[1] != num) {
	printf(«Fail num %s\n»,num);
	printf(«Fail arg %s\n»,argv[1]);
		exit(0);
	}

...
}

Подскажите, почему сравниваются два одинаковых значения, но определяются, как - неодинаковые!

Вывод программы:

Fail num 5555
Fail arg 5555

Ответ на: комментарий от anonymous

ты ж там какую-то прикладную математику пишешь на сишечке

И что? Я еще плитку кладу, штукатурю/шпаклюю/крашу, варю, сантехнику могу с нуля сделать, электрику, да много чего. Я же не являюсь плиточником/штукатуром/сварщиком/сантехником и т.п.!

Когда человек из религиозных побуждений отказывается от удобных инструментов

С фига ли "религиозных"? Мне просто эти инструменты не нужны.

Anon
()
Ответ на: комментарий от Kuzy

То есть в промежутке [-128, 127] число неявно заменяется объектом из кеша за соответствующим номером. А иначе new Integer-ом.

man Integer#valueOf man Integer(int)

dzidzitop ★★
()
Ответ на: комментарий от emulek

Всё равно лучше не использовать в своём коде этот INT_MAX

і ловіть overflow errors.

dzidzitop ★★
()
Ответ на: комментарий от qulinxao

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

это всё зависит от того, что ты УЖЕ знаешь.

emulek
()
Ответ на: комментарий от qulinxao

логирование(безусловный дебугпринт в «куда нибудь» в память)

Прямо в видеопамять. Так и делал, иногда. Но данные могут оказаться не актуальными. Иногда, при глюке, в видеопамять мог попасть и мусор, и ничего ценного на экране не увидишь. Если основная, исполняемая в это время, программа переключает видеоадаптер в графический режим, то тоже «жопа». Отрисовывать символы попиксельно - это было уж слишком.

сильно увеличивало тайминги?

Это не было проблемой.

dvl36
()
Ответ на: комментарий от qulinxao

вместо родных с указателей можно ознакомить с массивом содержащим разнородные связаные структуры

вместо ZZZ можно ознакомить с YYY

ну всё верно, если УЖЕ знаком с YYY. Причём _хорошо_ знаком, и есть опыт использования на практике.

emulek
()
Ответ на: комментарий от emulek

если сомневаешься, зачем пишешь (void*)0, а не просто 0? Это ведь одно и то же по твоему?

На С++ просто 0. Но что будет в указателе - implementation specific.

dzidzitop ★★
()
Ответ на: комментарий от emulek

ты невнимателен. Там как в сишечке «определено реализацией», т.е. хрен знает как(потому как ты не знаешь, с какими опциями твой юзер пожелает запускать твой код).

== для ссылочных тіпов - проверка на identity. Проверять на equality через .equals(). Каждому жавісту это очевідно.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

На С++ просто 0.

читай выше. Я в курсе про C++, речь здесь о C.

emulek
()
Ответ на: комментарий от emulek

size_t, это тип размера в неких абстрактных char'ах. Во многих реализациях этот char является обычным байтом, но не обязательно.

В стандарте Ц99 указан char = byte (не обязательно октет).

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

В стандарте Ц99 указан char = byte (не обязательно октет).

и что даёт ещё одно название? И да, byte ЕМНИП беззнаковый.

emulek
()
Ответ на: комментарий от emulek

байт - минимально адресуемое значение на данной архитектуре. Соответственно, все размеры пляшут от него. А октет - это именно 8 битов. Байт же не обязан быть 8 битов, хотя на практике другое значение практически не встречается(это не означает, что оно не встретится через десяток-другой лет), а раньше были и по 6 и по 7 битов, например.

anonymous
()
Ответ на: комментарий от anonymous

байт - минимально адресуемое значение на данной архитектуре. Соответственно, все размеры пляшут от него.

char — тоже. В сишечке(и в плюсах) он равен 1, по определению.

А октет - это именно 8 битов.

а при чём тут вообще октет?

Байт же не обязан быть 8 битов, хотя на практике другое значение практически не встречается(это не означает, что оно не встретится через десяток-другой лет), а раньше были и по 6 и по 7 битов, например.

и в чём я провинился, что заслужил эту лекцию? Может ты мне ещё про таблицу умножения расскажешь?

emulek
()
Ответ на: комментарий от dzidzitop

Память & I/O меряется байтамі.

в сишечке нет памяти и IO в байтах. Есть в char'ах. Один char равен одной единице памяти или IO. Если ты говоришь, что char===byte, то зачем мне byte? Или это всё-же краткая запись unsigned char?

emulek
()
Ответ на: комментарий от dzidzitop

ну а с nullptr будет compilation error.

а для меня warning == error. Единственная разница, код с warning попадает в DVCS, в назидание. А код с error не попадает, потому-что это скорее всего неинтересная и явная очепятка.

emulek
()
Ответ на: комментарий от emulek

еслі бы char (== 1) мог бы занимать 4 байта, то было бы непонятно как через char[] buf прочитать файл (особенно mmap). А так проблема не возникает.

dzidzitop ★★
()
Ответ на: комментарий от emulek

и да, сейчас некоторые процессоры имеют 16и битные char'ы(там всё 16и битное). DSP вроде. Народ здесь рассказывал, даже с пруфами.

emulek
()
Ответ на: комментарий от dzidzitop

еслі бы char (== 1) мог бы занимать 4 байта, то было бы непонятно как через char[] buf прочитать файл (особенно mmap). А так проблема не возникает.

Если char занимает 4 байта, то ты всё равно один байт НИКАК не прочитаешь, только разве что так:

char x = getc(stream);
x &= 0x00FF000000;
x >>= 12;// "читаем" один октет

emulek
()
Ответ на: комментарий от wota

да щаз!

gcc gk1.c 
gk1.c: In function 'main':
gk1.c:1:14: warning: initialization makes integer from pointer without a cast [enabled by default]
 #define NULL ((void*)0)
              ^
gk1.c:3:10: note: in expansion of macro 'NULL'
  int x = NULL;
          ^

emulek
()
Ответ на: комментарий от wota

опять же при полном молчании gcc

а откуда компилятору знать, что тип «неконстантный указатель» ты направил внутрь кода? Лучше-бы ты его себе в попу направил...

emulek
()
Ответ на: комментарий от emulek

а откуда компилятору знать, что тип «неконстантный указатель» ты направил внутрь кода?

у тебя шизофазия

Лучше-бы ты его себе в попу направил...

и латентное маководство

wota ★★
()
Ответ на: комментарий от anonymous

Прошу ответить на вопрос по коду:

#define ARR_SIZE  100

struct abc{
    struct abc  *r;
    struct abc  *l;
};

struct def{
    struct abc  arr_abc[ARR_SIZE];
}

struct def
*init_def()
{
    struct def   *def;
    int          k;

    def = (struct def*)malloc(sizeof(struct def));
    if(def == NULL) return(NULL);

    memset(def, 0, sizeof(struct def));
    for(k=0; k < ARR_SIZE; k++){
        def->arr_abc[k].r = NULL;
        def->arr_abc[k].l = NULL;
    }
    return(def);
}

По замыслу, все указатели при инициализации должны быть NULL.
Правильно ли, что я сделал цикл зануления указателей?
Или достаточно memset, а цикл не надо?
Это к тому, что не всегда NULL = 0.

oleg_2
()
Ответ на: комментарий от wota

у тебя старый gcc

у тебя шизофазия

и латентное маководство

а у тебя тотальное невежество, которое ты прячешь за оскорблениями. Вот только шило в мешке не утаишь... Лучше-бы ты почитал чё-нить о предмете обсуждения.

Повторяю ещё раз: всё работает не так, как ты хочешь, а так, как оно должно работать. Это тебе не ясельки, попку подтирать никто не будет.

emulek
()
Ответ на: комментарий от wota

NULL я переопределил, как и говорил

о_О, ты странный

что тут странного? Как говорил, так и сделал. И получил ровно то, о чём и говорил.

А ты сделал по своему, и получил что-то другое. Что тут странного?

emulek
()
Ответ на: комментарий от oleg_2

Или достаточно memset, а цикл не надо?

слушай, а зачем ты вообще извращаешься? Почему просто не обойти в цикле структуру, и напихать в неё NULL'ей?

Это к тому, что не всегда NULL = 0.

в стандарте написано — не обязательно. Потому твой код == мина замедленного действия. Он сейчас работает, а потом сломается. Я не знаю когда.

emulek
()
Ответ на: комментарий от oleg_2

и по части дизайна: если ты выделил память в одном месте, ты ОБЯЗАТЕЛЬНО ЗАБУДЕШЬ её освободить. Поверь мне, старому человеку.

emulek
()
Ответ на: комментарий от oleg_2

ну и наконец, если структура не очень большая, то сделай её глобальной (в пределах единицы трансляции), тогда нули сами напихаются.

emulek
()
Ответ на: комментарий от emulek

emulek =Почему просто не обойти в цикле структуру, и напихать в неё NULL'ей?=

Вот так рас, посмотрите цикл в коде, что это, как не обход структуры?
memset нужен всё равно, там есть еще переменные, которые я не указал,
и которые надо обнулять (int-ы).

oleg_2
()
Ответ на: комментарий от emulek

За советы спасибо. Глобальные мне не разрешают.
=если ты выделил память в одном месте, ты ОБЯЗАТЕЛЬНО ЗАБУДЕШЬ её освободить=

А вот и не забуду. Как я могу забыть, вот схема функции:

int fun(...)
{
    struct def   *def=NULL;

    def=init_def();
    if(def==NULL) goto ERR;
      ....
    free(def);
    def=NULL;
      ....
    return(0);

ERR:
    if(def != NULL) free(def);
    return(-1);
}
И самый главный вопрос - цикл я правильно сделал?
Нашелся человек, который уверял, что memset достаточно, цикл не надо.
В чем Вы мину увидели? Цикл есть, NULL присваивается? Может Вы этого
сначала незаметили?

oleg_2
()
Ответ на: комментарий от oleg_2

Во-первых, если ты memset-ом занулил память, нахрена ты её повторно зануляешь в цикле?

Во-вторых, выкини цикл и memset на помойку, и следом отправь malloc. Затем прочитай man на calloc, там английским по черному сказано, что он обнуляет выделяемую память.

Итого: весь код можно заменить на вызов одной функции.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.