• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Сортировка по алфавиту

  • Автор темы BattleMage
  • Дата начала
F

Folderx

Да обычный велосипед это древняя конструкция, тогда так было модно. Проще придумать свое 2-х колесное транспортное средство, чем научится на нем ездить.
Можешь сделать обратное сравнение, сделай, а не можешь так и делай всегда прямое, если бы ты ездил на велосипеде который изобрели самым первым, то ты б щас тут не сидел :blink:
Я могу пользоваться обычными функциями, но лучше они от этого не станут. Топорный вариант.

Приведи конкретный глючный пример, а не "когда-то у меня что-то не работало".
Так у меня есть конкретный пример, только кто этим будет заниматься, ты ?
А если у тебя не получится разгадать, ты мне чо скажешь, а ну да ну да(смысл мне его щас откапывать сидеть, менять обратно код, чтобы ты мне сказал ну я не знаю спроси у кого-нибудь другого)

Изменение string1[0] должно затирать digit1[0], и, судя по соседнему топику, затирает. Что не так?
Там string1[0] складывается с string1[1]
а digit1[0] не складывается с digit1[1]

Поэтому строки выводятся в сложенном виде, а числа (нулевые элементы) затёрлись как-то.
 
P

Pasha

<!--QuoteBegin-Folderx+23:09:2007, 00:09 -->
<span class="vbquote">(Folderx @ 23:09:2007, 00:09 )</span><!--QuoteEBegin-->Там string1[0] складывается с string1[1]
а digit1[0] не складывается с digit1[1]

Поэтому строки выводятся в сложенном виде, а числа (нулевые элементы) затёрлись как-то.
[snapback]79222" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ты вообще представляешь как работает union? Это сложнейшая вещь :blink:. Если бы у тебя хватило времени открыть хотя бы мсдн, ты бы увидел следующее:<!--QuoteBegin-msdn+-->
<span class="vbquote">(msdn)</span><!--QuoteEBegin-->A union is a user-defined data or class type that, at any given time, contains only one object from its list of members (although that object can be an array or a class type).[/quote]т.е. или string1, или string2, или digit1, или digit2. И лежат они в одном куске памяти, причем, скорее всего, первые 4 байта из string1/2 попадают на digit1/2[0]. Ты пишешь в первый байт '.', оно же 0x2E, во второй '*', оно же 0x2A. Должен получить в digit1/2[0] значение 0x00002A2E, оно же 10798. Проверяешь - все сходится.
А теперь докажи мне, что у тебя неправильно работает scanf, и что проверенный годами и тысячами людей CRT хуже, чем твой самописный и недокументированный код.
 
G

garrymax

Folderx, похоже ты просто так не остановишься (хоть и не в тему самого вопроса), но заметь:
Я могу пользоваться обычными функциями, но лучше они от этого не станут. Топорный вариант.
Это уже какой-то "наезд" на всё UNIX сообщество - именно там эта функция создавалась и годами оттачивалась, кстати, как и весь Си, на котором ты сейчас пишешь. Подробнее: Эти "топорные функции" используют повсеместно самые устойчивые операционками (и не только OS) на протяжении многих лет и у них таких глюков нет, а ты их "в черный список" из-за одного куска своей программы.

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

Только без обид: Я где-то в 1985-1986 году (короче - давненько) перебрался с UNIX на MS-DOS (появились и у нас IBMки - правильнее РСюки) и там у меня функция printf вешала комп наглухо, если я с первым аргументом мудрил. Дошло до того, что пришлось закупать и перечитывать документацию (к тому времени уже печатали, а в ДОСе МЭНов нет, тем более по Си). А эта функция зеркальный близнец scanf's - как бы похоже на твой случай.

Замечу еще одну вещь: Функции из стандартных библиотек, обычно переписывают по двум причинам:
  1. Вопрос безопасности - возможность использования их при внешних аргументах для предотвращения DOS-атак
  2. Ускорение выполнение программы - выполнения ограниченных возможностей без лишних проверок
Так вот второе, из-за того, что стандартная функция оттачивалась годами и не одним программистом, обычно давала обратный результат. Но из-за "глючности" ? - ...........
 
F

Folderx

Код:
int i, j;
char *name;
int kletka[1];


for ( i = 0; i < 9; i++ )
{
if ( *kletka == -1 )
printf("ошибка, введите номер, а не букву\n");
else	 
printf("%s введите номер: ");

scanf( "%d", &kletka ); /* Не получается сделать так чтобы сканф не зацикливался, когда вводишь не цифру. */

switch (*kletka)
{
default :
i--; 
*kletka = -1;

}
}
Расступитесь все, щас Pasha покажет класс, надо сделать так чтобы она не зацикливалась :rolleyes:

<!--QuoteBegin-Pasha+-->
<span class="vbquote">(Pasha)</span><!--QuoteEBegin-->Ты вообще представляешь как работает union? Это сложнейшая вещь[/quote]
Да чо там сложного кусок памяти лежит и в нём ссылки по ходу(или со времён обработки памяти придумали какие-то новые виды адресации).

<!--QuoteBegin-Pasha+-->
<span class="vbquote">(Pasha)</span><!--QuoteEBegin-->значение 0x00002A2E[/quote]
А ну терь ясно значит она побайтово записывает, я читал что все переменные в юнионе наложены друг на друга, и размер юниона определяется самой большой переменной, то есть в принципе при желании можно получить 46, только с помощью чего...(арифметических операций может)

<!--QuoteBegin-garrymax+-->
<span class="vbquote">(garrymax)</span><!--QuoteEBegin-->Стандартный совет: Читай внимательно документацию - если ты программист (зарабатываешь этим), то твой инструмент включает и стандартные библиотеки, которые облегчают и ускоряют написание программ - надо внимательно изучать инструкции к применению того, чем ты себе кусок хлеба добываешь.[/quote]
Так я вместо документации использую коды этих функций, так быстрее понимаешь чо там да как, и вообще если пользоваться только стандартными средствами далеко не уйдёшь, надо свои функции иметь, которые более удобны понятны и про которые никто не знает B)
 
P

Pasha

<!--QuoteBegin-Folderx+23:09:2007, 08:16 -->
<span class="vbquote">(Folderx @ 23:09:2007, 08:16 )</span><!--QuoteEBegin-->Расступитесь все, щас Pasha покажет класс, надо сделать так чтобы она не зацикливалась
[snapback]79233" rel="nofollow" target="_blank[/snapback]​
[/quote]
Твой кусок мегакода не может работать по следующим причинам:
1. Ты не инициализируешь kletka[0], с которым потом работаешь: ...if ( *kletka == -1 )...
2. Ты наивно полагаешь что если значение не прочитано, то в переменной будет лежать -1
3. Почему-то передаешь в scanf ссылку на указатель на переменную, вместо ссылки на переменную (&(kletka[0]))
4. Не чистишь сходящий буффер (потому что CRT ты не знаешь, и чистить этого буффер не умеешь)
5. Ты в принципе не веришь в стандартные функции, и в то, что следующий код работает, хотя в нем нет работы с указателями, switch, и даже мегацикла for.
Код:
int kletka;
bool kletka_entered = false;

printf("Введите номер: ");
while (!kletka_entered)
{
if (scanf( "%d", &kletka ) == 1)
{
kletka_entered = true;
}
else
{
printf("Ошибка, введите номер, а не букву: ");
fflush(stdin);
}
}

printf("Вы ввели меганомер %d\n", kletka);
<!--QuoteBegin-Folderx+23:09:2007, 08:16 -->
<span class="vbquote">(Folderx @ 23:09:2007, 08:16 )</span><!--QuoteEBegin-->Так я вместо документации использую коды этих функций, так быстрее понимаешь чо там да как, и вообще если пользоваться только стандартными средствами далеко не уйдёшь, надо свои функции иметь, которые более удобны понятны и про которые никто не знает
[snapback]79233" rel="nofollow" target="_blank[/snapback]​
[/quote]И получешь в результате код, без документации, не работающий, и про который никто не знает. Но зато удобный-удобный...
 
F

Folderx

<!--QuoteBegin-"Pasha"+-->
<span class="vbquote">("Pasha")</span><!--QuoteEBegin-->4. Не чистишь сходящий буффер (потому что CRT ты не знаешь, и чистить этого буффер не умеешь)[/quote]
А почему я должен это делать за сканф, почему она не очищает его сама(где-то требуется чтобы буфер не был очищен?)

С указателями я разобрался там потом, подробнее почитал где что как, почему два разных входа в сканф выполняются как один из-за того что сканф не отделяет себя от остального. Значит функция не эффективна B)

<!--QuoteBegin-"Pasha"+-->
<span class="vbquote">("Pasha")</span><!--QuoteEBegin-->2. Ты наивно полагаешь что если значение не прочитано, то в переменной будет лежать -1[/quote]
А что там будет лежать делаешь принтф и там -1, и когда зацикливается показывает значение *kletka равно -1

<!--QuoteBegin-"Pasha"+-->
<span class="vbquote">("Pasha")</span><!--QuoteEBegin-->И получешь в результате код, без документации, не работающий[/quote]
Почему не работающий, я же его пишу чтобы он мне помогал, а не просто так чтобы было :rolleyes: и чтобы нормально его отрегулировать, чтобы переменные можно было передавать без всяких ссылок, а просто как во всех языках программирования(ну других)
 
P

Pasha

<!--QuoteBegin-Folderx+23:09:2007, 23:28 -->
<span class="vbquote">(Folderx @ 23:09:2007, 23:28 )</span><!--QuoteEBegin-->А почему я должен это делать за сканф, почему она не очищает его сама(где-то требуется чтобы буфер не был очищен?)
[snapback]79278" rel="nofollow" target="_blank[/snapback]​
[/quote]Потому что входной поток может быть перенаправлен (echo y > myprog.exe), и в буффер записаны данные сразу для всей программы, а не для одного конкретного scanf. И при этом для вызывающего не должно быть разницы между вызовом, например, scanf("%d%d%s), и тремя последовательными вызовами.
<!--QuoteBegin-Folderx+23:09:2007, 23:28 -->
<span class="vbquote">(Folderx @ 23:09:2007, 23:28 )</span><!--QuoteEBegin-->С указателями я разобрался там потом, подробнее почитал где что как, почему два разных входа в сканф выполняются как один из-за того что сканф не отделяет себя от остального. Значит функция не эффективна
[snapback]79278" rel="nofollow" target="_blank[/snapback]​
[/quote]Если два вызова работают как один - значит функция эффективна, т.к. производительность не падает при большом количестве вызовов/при вызове разных функций работы с stdin/out.
<!--QuoteBegin-Folderx+23:09:2007, 23:28 -->
<span class="vbquote">(Folderx @ 23:09:2007, 23:28 )</span><!--QuoteEBegin-->А что там будет лежать делаешь принтф и там -1, и когда зацикливается показывает значение *kletka равно -1
[snapback]79278" rel="nofollow" target="_blank[/snapback]​
[/quote]Вот всмотрись в свой код, и ответь, что будет лежать в *kletka при первом выполнении сравнения в строчке 6. Мой отладчик говорит большим диалогом в центре экрана "переменная использована без инициализации". Если ты считаешь что на самом деле она инициализированна, напиши в майкрософт, пусть срочно правят баг в visual studio.
Код:
1 int i, j;
2 char *name;
3 int kletka[1];

4 for ( i = 0; i < 9; i++ )
5 {
6  if ( *kletka == -1 )
<!--QuoteBegin-Folderx+23:09:2007, 23:28 -->
<span class="vbquote">(Folderx @ 23:09:2007, 23:28 )</span><!--QuoteEBegin-->Почему не работающий, я же его пишу чтобы он мне помогал, а не просто так чтобы было и чтобы нормально его отрегулировать, чтобы переменные можно было передавать без всяких ссылок, а просто как во всех языках программирования(ну других)
[snapback]79278" rel="nofollow" target="_blank[/snapback]​
[/quote]Ты пишешь его, потому что не можешь разобраться в стандартной библиотеке, и потому что она not invented here. Переменные в C, кстати, передаются по значению, без всяких ссылок.
 
F

Folderx

<!--QuoteBegin-"Pasha"+-->
<span class="vbquote">("Pasha")</span><!--QuoteEBegin-->И при этом для вызывающего не должно быть разницы между вызовом, например, scanf("%d%d%s), и тремя последовательными вызовами.[/quote]
А то что там одна и та же переменная и он будет её что(затирать или продолжать), это ничо, да ?
Я вот хочу чтобы он три раза по разному записал переменную, почему мне необходимо сбрасывать буфер, если в программу не поступает никаких данных ?
За счёт сброса буферов, которые может я и не хочу сбрасывать тратится и время и возникают уже сложности с буферами, нормально, да ?

Мне нужна функция, которая ждёт конца строки просто, а потом начинается заново, не хочу я сбрасывать буфер(отдельной функцией ;) )

<!--QuoteBegin-"Pasha"+-->
<span class="vbquote">("Pasha")</span><!--QuoteEBegin-->Если два вызова работают как один - значит функция эффективна, т.к. производительность не падает при большом количестве вызовов[/quote]
А может у меня нету большого количества вызовов, тогда мне надо дописывать вызов другой функции, которая тоже жрёт чо-то.

<!--QuoteBegin-"Pasha"+-->
<span class="vbquote">("Pasha")</span><!--QuoteEBegin-->Вот всмотрись в свой код, и ответь, что будет лежать в *kletka при первом выполнении сравнения в строчке 6. Мой отладчик говорит большим диалогом в центре экрана[/quote]
Да там идея была чтобы сослаться на первый элемент массива. Кстати прикол, ты по ходу не знаешь что клетка нормально вводится(я же не полный текст программы привёл, так что про инициализацию это глюки уже, у меня там не инициализировано ничего кроме int kletka[1]; и вся программа работает), наверно действительно твой отладчик не отличает int kletka[1] от int *kletka <_<

<!--QuoteBegin-"Pasha"+-->
<span class="vbquote">("Pasha")</span><!--QuoteEBegin-->Ты пишешь его, потому что не можешь разобраться в стандартной библиотеке, и потому что она not invented here. Переменные в C, кстати, передаются по значению, без всяких ссылок.[/quote]
Ага, а муть с адресами переменных это просто муть ;)
Я как сказал так сказал, мне просто они неудобны, как бывает программы неудобны достаёшь другие, или делаешь свои, конечно можно научиться пользоваться теми которые есть, но можно и не учиться, можно просто сделать как хочешь. Написать функцию которая буфер за собой чистит и всё B)
 
P

Pasha

<!--QuoteBegin-Folderx+25:09:2007, 10:18 -->
<span class="vbquote">(Folderx @ 25:09:2007, 10:18 )</span><!--QuoteEBegin-->А то что там одна и та же переменная и он будет её что(затирать или продолжать), это ничо, да ?
Я вот хочу чтобы он три раза по разному записал переменную, почему мне необходимо сбрасывать буфер, если в программу не поступает никаких данных ?
За счёт сброса буферов, которые может я и не хочу сбрасывать тратится и время и возникают уже сложности с буферами, нормально, да ?
Мне нужна функция, которая ждёт конца строки просто, а потом начинается заново, не хочу я сбрасывать буфер(отдельной функцией )...Написать функцию которая буфер за собой чистит и всё
[snapback]79458" rel="nofollow" target="_blank[/snapback]​
[/quote]
Отлично. А что это нужная функция должна делать, если пользователь введет сразу нескололько строк? Очистить сразу весь буффер? Очистить буффер до первого перевода строки? Очистить буффер до первого пробельного символа? И как должена другая программа выдавать в твою данные? стразу все? по кусочкам с паузой в X миллисекунд? Разделенные буквой З?
Тебе, похоже, надо считать строчку до '\n', и поискать в ней число. Вот и используй gets+sscanf или atoi.<!--QuoteBegin-Folderx+25:09:2007, 10:18 -->
<span class="vbquote">(Folderx @ 25:09:2007, 10:18 )</span><!--QuoteEBegin-->А может у меня нету большого количества вызовов, тогда мне надо дописывать вызов другой функции, которая тоже жрёт чо-то.
[snapback]79458" rel="nofollow" target="_blank[/snapback]​
[/quote]А самописная функция, сразу чистящая буффер, ничего не жрет? <_<
<!--QuoteBegin-Folderx+25:09:2007, 10:18 -->
<span class="vbquote">(Folderx @ 25:09:2007, 10:18 )</span><!--QuoteEBegin-->Да там идея была чтобы сослаться на первый элемент массива. Кстати прикол, ты по ходу не знаешь что клетка нормально вводится(я же не полный текст программы привёл, так что про инициализацию это глюки уже, у меня там не инициализировано ничего кроме int kletka[1]; и вся программа работает), наверно действительно твой отладчик не отличает int kletka[1] от int *kletka
[snapback]79458" rel="nofollow" target="_blank[/snapback]​
[/quote]Да, это тупит отладчик, напиши в майкрософт, пусть срочно правят, они же им винду отлаживают.
int kletka[1] - это массив из одного элемента, kletka[0] (он же *kletka) - это его первый элемент. Не замечаешь разницы?<!--QuoteBegin-Folderx+25:09:2007, 10:18 -->
<span class="vbquote">(Folderx @ 25:09:2007, 10:18 )</span><!--QuoteEBegin-->Ага, а муть с адресами переменных это просто муть
[snapback]79458" rel="nofollow" target="_blank[/snapback]​
[/quote]Нет, не ага. Если не нравятся указатели, пиши на VB. Если не нравится CRT/STL - пиши на VB....
 
G

garrymax

Для: Folderx
не надоело - вынь бревно из своего глаза:
Код:
int kletka[1];
scanf( "%d", &kletka );
- сразу три ошибки и еще отсутствие "тона хорошего программирования" (как четвертая, если прога глючит, но тебе уже об этом Pasha писал), хотя судя по упертости и несогласию, это для тебя норма - читай внимательно документацию, а теперь уже и по Си, непосредственно по применению ссылок и имен массивов.

Просто попробуй так:
Код:
#include <stdlib.h>
#include <stdio.h>
char my[256];
int kletka[1];

printf("Введите номер: ");
scanf( "%s", my);
while (atoi(my) ==0){
printf("%s - Это не цифра, надо цЫфры вводить (прошу):",my);
scanf( "%s", my);
}
kletka[0]= atoi(my);
printf("Вот это число:%d\n\n",kletka[0]);
читай внимательно документацию
 
P

Pasha

Для: garrymax
Бесполезно, Folderx все равно уверен в кривизне стандартной библиотеки. Да и документацию читать долго, проще все по-быстрому переписать самому, чтобы принимало строки по значению, чистило буффер, само инициализировало переменные, собирало мусор и вообще читало мысли. <_<
 
E

European

Дабы не провоцировать очередной виток holy war все сообщения обсуждения стандартов в программировании перенесены сюда: https://codeby.net/threads/17827.html
В данной теме просьба обсуждать только вопросы сортировки
 
F

Folderx

Я за то чтобы сортировать слева направо и справа налево, как я выберу, потому что кроме "мама", "человек", "мир", "папа", "арбуз", "баня", бывают ещё и другие случаи когда обратно получилось бы быстрее, а стандартная функция такой возможности не даёт. Всё.
 
N

Normann

<!--QuoteBegin-Folderx+19:09:2007, 11:36 -->
<span class="vbquote">(Folderx @ 19:09:2007, 11:36 )</span><!--QuoteEBegin-->С массивами там глюк видимо ...
[snapback]78776" rel="nofollow" target="_blank[/snapback]​
[/quote]


... European: не будем переходить на личности
 
P

Pasha

<!--QuoteBegin-Folderx+2:10:2007, 00:57 -->
<span class="vbquote">(Folderx @ 2:10:2007, 00:57 )</span><!--QuoteEBegin-->Я за то чтобы сортировать слева направо и справа налево, как я выберу, потому что кроме "мама", "человек", "мир", "папа", "арбуз", "баня", бывают ещё и другие случаи когда обратно получилось бы быстрее, а стандартная функция такой возможности не даёт. Всё.
[snapback]80239" rel="nofollow" target="_blank[/snapback]​
[/quote]Не дает? Бедные разработчики, им не разрешают сортировать в обратном порядке... Ну-ну.
Код:
int intcompare_elements (char **p1, char **p2) {
return -strcoll (*p1,*p2);
}
 
N

Normann

<!--QuoteBegin-Normann+2:10:2007, 04:16 -->
<span class="vbquote">(Normann @ 2:10:2007, 04:16 )</span><!--QuoteEBegin-->... European: не будем переходить на личности
[snapback]80243" rel="nofollow" target="_blank[/snapback]​
[/quote]
Какие личности?
Зачем балуешься?
 
E

European

Для: Normann
Нечего сказать - нехрен флудерастить
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!