Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизКто-нить программил на Си++ Найти похожие ветки
← →
Voland2000 (2004-04-12 16:43) [0]Здрасть, кто программил на Си++ (BC 3.11) ,пожалуста, отставьте свой e-mail.
← →
Игорь Шевченко © (2004-04-12 16:51) [1]Новый вид спама ?
← →
Тимохов © (2004-04-12 16:56) [2]Уважаемый программист на СИ.
Предлагаем вам новый продукт - дельфи. Пишите на нем.
Если прилете 10 адресов дригих программистов на си, исключим вас из данной рассылки.
← →
Anatoly Podgoretsky © (2004-04-12 16:58) [3]Может он для этой цели и хочет :-)
← →
clickmaker © (2004-04-12 16:59) [4]
> Voland2000 (12.04.04 16:43)
Открываешь кружок по интересам ?
← →
TButton © (2004-04-12 17:03) [5]да.
← →
TButton © (2004-04-12 17:04) [6]я более чем уверен, что "кто программил на Си++", иначе мы бы о нем не знали =)
← →
serge35 (2004-04-12 17:06) [7]А может еще 100 р. по почте прислать?
← →
clickmaker © (2004-04-12 17:11) [8]
> serge35 (12.04.04 17:06) [7]
> А может еще 100 р. по почте прислать?
На развитие клуба любителей Си++.
> Voland2000 (12.04.04 16:43)
На открытии клуба, кстати, халявное пиво будет ?
← →
TButton © (2004-04-12 17:16) [9]Удалено модератором
Примечание: Offtopic
← →
Voland2000 (2004-04-13 04:48) [10]Ну, ладно тогда я оставлю свой вопрос здесь:
Вот функция (на Си++). Она должна добавлять строку (str) под номером (num) в массив dates:void AddtoArray(char *str,int num){
char *stradd;
char **newarray;
int x,x1,adding_el;
adding_el=0;
newarray=(char **)calloc(size+1,sizeof(char *));
x=0;
x1=0;
while (x<=size){
if (x!=num || adding_el==1){
stradd=dates[x];
newarray[x1]=(char *)calloc(strlen(stradd)+1,sizeof(char));
strcpy(newarray[x1],dates[x]);
x++;
x1++;
}
else {
stradd=str;
newarray[x1]=(char *)calloc(strlen(stradd)+1,sizeof(char));
adding_el=1;
strcpy(newarray[x1],str);
x1++;
}
}
size++;
dates=(char **)calloc(size,sizeof(char *));
for (x=0;x<=size;x++){
stradd=newarray[x];
dates[x]=(char *)calloc(strlen(stradd)+1,sizeof(char));
strcpy(dates[x],newarray[x]);
}
for (x=0;x<=size;x++){
free(newarray[x]);
}
free(newarray);
}
Но, вот где-то здесь большой косяк.
Пожалуйста, очень надо.
← →
Паниковский © (2004-04-13 06:46) [11]IMHO
newarray[x1]=(char *)calloc(strlen(stradd)+1,sizeof(char));
1 ты не можеш изменить размер массива в realtime
2 ты выделил памяти размера char а не char*(лучше даже выделять char[256])
3 попробуй использовать не char** а void*
4 если ты хочешь все таки пользоватся именно char** то напиши функцию например такую
char** x;
AddString(char *newStr){
char** y;
y = (char**)calloc(strlen(stradd)+1,sizeof(x)+sizeof(newStr));
delete []x;
x = y;
return 0;
}
ну или что то около того
← →
Suntechnic © (2004-04-13 06:59) [12]>Voland2000 (13.04.04 04:48)
Во-первых привыкай писать комментарии иначе через время сам не разберёшься что здесь происходит. Теперь по коду....
То, что сразу бросается в галаза: Здесь не весь код приведен и не видно что есть size и dates, но судя по логике... что будет, если изначально dates пуст и size == 0? Я тебе расскажу, что будет... вылетишь на второй итерации. Далее... прежде, чем присваивать dates новое значение (dates=(char **)calloc(size,sizeof(char *));
), надо сначала освободить память от предыдущего (если оно там было конечно), иначе это прямая дорога к memory leaks.
← →
Suntechnic © (2004-04-13 07:10) [13]>Voland2000
И ещё. Вот в этих последних двухfor (x=0;x<=size;x++)
вылетишь ещё разок, так как выскочишь за пределы массива. Ты сделал уже size++, так что он соответствует размеру newarray и x<=size выскакивает за его предел.
← →
Suntechnic © (2004-04-13 07:28) [14]>Voland2000
Кстати ты ещё что-то там со счётчиками перемудрил в цикле while. Не будет так работать.
>Паниковский ©
1 ты не можеш изменить размер массива в realtime
No comments
2 ты выделил памяти размера char а не char*(лучше даже выделять char[256])
Он выделили массив под хранение массива, поэтому и char *.
3 попробуй использовать не char** а void*
Гениальный совет по своей сути.
4 если ты хочешь все таки пользоватся именно char** то напиши функцию например такую
char** x;
AddString(char *newStr){
char** y;
y = (char**)calloc(strlen(stradd)+1,sizeof(x)+sizeof(newStr));
delete []x;
x = y;
return 0;
}
Это вообще бред какой-то.
← →
Паниковский © (2004-04-13 07:43) [15]Suntechnic
>>4
я в свое время тоже самое делал только я массив по новой выделял и копировал на старый массив и все нормально работает
← →
Паниковский © (2004-04-13 07:47) [16]Suntechnic
во всяком случае под TC3 BC45 BC502
вариант с копирование проходил и без ошибок
← →
Suntechnic © (2004-04-13 07:54) [17]>Паниковский ©
>>4
я в свое время тоже самое делал только я массив по новой выделял и копировал на старый массив и все нормально работает
Я могу несколько подсократить твой код для Win 32 платформы чтобы проще было:char** x;
AddString(char *newStr){
char** y;
y = (char**)calloc(strlen(stradd)+1, 8);
delete []x;
x = y;
return 0;
}
После выполнения этого кода по адресу x будут лежать нечто ужасное размером равным длине строки stradd + 1 и размерностью 8 байт.
← →
Паниковский © (2004-04-13 08:04) [18]Suntechnic
я код не точно воспроизвел
исходник сейчас вообще черт его знает где
поэтому я примерный вариант кинул
кароче Склифасовский мое сообщение
начинается с IMHO т.е. обрати внимание
← →
MPS © (2004-04-13 09:14) [19]Voland2000 (12.04.04 16:43)
Здрасть, кто программил на Си++ (BC 3.11) ,пожалуста, отставьте свой e-mail.
Здрасть! Я програмил, програмлю, и всегда буду програмить на С++. Только среду ты выбрал плохую для програмканья. Советую VC++, билдер это просто игрушка. Я это уже понял. Е-Маил: p.maxim@mail.ru
← →
N170 (2004-04-13 09:43) [20]Кстати, зачем автору ветки ваши e-mail-ы?
Задумайтесь. Большой Брат не с++пит.
← →
Nikolay M. © (2004-04-13 10:11) [21]
> for (x=0;x<=size;x++){
Таки нужно x<size. Или не делать size++ с соотв. правкой остальных строк.
> size++;
> dates=(char **)calloc(size,sizeof(char *));
> for (x=0;x<=size;x++){
Утечка памяти, теряется старый массив dates. Почему бы просто не сделать realloc?
Да и вообще, на самом деле, уничтожаешь старый dates, как уже сказали: delete []x и переприсваиваешь указатель: dates = newarray. Зачем эти премудрости с копированием из нового массива в старый и освобождение нового массива?
← →
Anatoly Podgoretsky © (2004-04-13 10:25) [22]Засланцы среди нас
← →
Voland2000 (2004-04-13 16:34) [23]Спасибочкис, но вот только я что-то боюсь вы думаете, что я от удовольствия на Си начал программить. На самом деле из всех языков на которых я программил(а их было много) Си является самым худшим, а по поводу выбора среды, то мне так сказали.
← →
Polevi © (2004-04-13 16:58) [24]>из всех языков на которых я программил
список огласи, и преимущества перед си
← →
Voland2000 (2004-04-13 17:12) [25]Пожалуйста:
1)Basic-очень удобен для начинающих и прост в обращение, хотя на нем я писал достаточно серьезные проги.
2)Pascal-самый лучший из языков. Понятный синтаксис, много функций, удобная среда.
3)Perl-хоть и является "продолжением Си", но с другой стороны имеет кучу функций по работе с массивами и гораздо удобней, чем Си.
4)Delphi(Delphi и Pascal-разные языки).Ну, тут и сравнивать нечего.
5)Assembler-без коментариев.
← →
Anatoly Podgoretsky © (2004-04-13 17:48) [26]Не это не засланец, похож на нашего человека, наоборот его заслали на воспитание во вражесткий лагерь, вот теперь парень и мучается.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c