PDA

Просмотр полной версии : проблема с созданием строки



shpi0
29.11.2005, 08:21
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

#define filename "c:\\temp\\saod.txt"

char *fillrand(int k)
{
char *s_random;
int i;
for (i=0;i<k;i++)
s_random[i]=random(97)+25;
return s_random;
}

main()
{
char *s;
randomize;
s=fillrand(1000);
FILE *f=fopen(filename,"w");
fputs(s,f);
fclose(f);
return 0;
}

Вот смотрите, не получается создать строку произвольных символов. И вообще часто такая ошибка возникает, не понимаю в чем дело.

Скрин ошибки http://tarko-selo.ru/bc.jpg

P.S. используется Borland C++ ver. 3.1

shpi0
29.11.2005, 08:25
И еще - думал что из-за того что NT стоит (там в ошибке что-то про NTVDM), под 98 виндой тоже ошибка, только пишется малость по-другому...

ssDev
29.11.2005, 08:38
Чета я не понял а где выделяется память под char *s_random

shpi0
29.11.2005, 08:44
А можно тут поподробнее? Я походу чего-то не знаю:)

shpi0
29.11.2005, 08:54
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

#define filename "c:/temp/saod.txt"

char *fillrand(int k)
{
int i;
char *s_random = new char[1000];
for (i=0;i<k;i++)
s_random[i]=random(25)+97;
return s_random;
}

main()
{
clrscr();
char *s = new char[1000];
randomize;
s=fillrand(1000);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
fputs(s,f);
fclose(f);
getche();
return 1;
}

так работает, все понял :)

shpi0
29.11.2005, 09:38
Нет, все равно еще вопросы остались...
Например надо вызвать fillrand 5 раз с k=1000 до 5000.
Как это сделать?
Пробовал просто задать char *s_random = new char[5000]; но так появляются всякие лишние символы в строке.

Hawk
29.11.2005, 10:20
Чего-то у тебя все не правильно, почитай по поводу выделения памяти поподробнее. Кроме того все строки должны оканчиваться 0 и выделенную памят следует всетаки удалать.
Что-то типа того должно быть.


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

#define filename "c:/temp/saod.txt"

char *fillrand(int k)
{
int i;
char *s_random = new char[k+1]; // Зачем тебе создавать 1000 элементов когда ты точно знаешь сколько тебе надо?
// + 1 для последнего нолика (строка всегда оканчивается на 0!)
for (i=0;i<k;i++)
s_random[i]=random(25)+97;

s_random[k] = 0; // добавили ноль

return s_random;
}

main()
{
clrscr();
char *s; // Тут не надо выделять пямять, т.к. мы выделим её в функции fillrand
randomize();
s=fillrand(1000);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
fputs(s,f);
fclose(f);
delete[] s; // НЕ ЗАБЫВАЕМ удалить выделенный кусок
getche();
return 1;
}

shpi0
29.11.2005, 10:48
О, ништяк!
Пасиба БОЛЬШОЕ!!!
Почитаю по памяти обязательно:)

shpi0
30.11.2005, 11:21
Я не могу понять что не так теперь-то. Как в этих вот функциях сортировки память надо распределять? По книжке Подбельского пытался посмотреть, там как-то стремно написано. Мож кто подскажет в инете инфу по этому разделу?



#define filename "c:/temp/saod.txt"

char *fillrand(int k)
{
int i;
char *s_random = new char[k+1];
for (i=0;i<k;i++)
s_random[i]=random(25)+97;
s_random[k] = 0;
return s_random;
}

unsigned long checksum(char *s)
{
unsigned long sum=0;
int i,j;
j=strlen(s);
for (i=0;i<j;i++)
sum += s[i];
return sum;
}

unsigned int runnumber(char *s)
{
int i,j;
unsigned int k;
j=strlen(s);
for (i=0;i<j;i++)
if (s[i] > s[i+1])
k++;
return k;
}

char *bubblesort(char *st)
{
int i,j,k;
char buf;
k=strlen(st);
for (i=0;i<k-1;i++)
for (j=k;j>=i+1;j--)
{
if (st[j]<st[j-1])
{
buf=st[j];
st[j]=st[j-1];
st[j-1]=buf;
}
}
return st;
}

char *shakersort(char *st)
{
int j,l=1,k=strlen(st),r=strlen(st);
char buf;
do
{
for (j=r;j>l;j--)
if (st[j]<st[j-1])
{
buf=st[j];
st[j]=st[j-1];
st[j-1]=buf;
}
l=k;
for (j=l;j<r;j++)
if (st[j]>st[j+1])
{
buf=st[j];
st[j]=st[j+1];
st[j+1]=buf;
k=j;
}
r=k;
}
while (l<r);
return st;
}

main()
{
clrscr();
randomize();

char *s,*sorted;
unsigned long sum;
unsigned int runnumb;

s=fillrand(1000);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
fputs(s,f);
fputs("\n\n",f);
sorted=shakersort(s);
fputs(sorted,f);
fclose(f);
delete[] s;
getche();
return 1;
}

WinMain
30.11.2005, 13:37
Вообще-то плохая манера выделять память внутри функции, а удалять её за пределами функции. Получается так, что если ты не вызовешь вначале функцию fillrand(), то весь последующий код работать не будет. Функции должны принимать указатель на уже имеющийся массив памяти или выделять её и удалять внутри себя. В твоём примере лучше было бы использовать статический массив или локальный массив внутри функции main().

shpi0
30.11.2005, 14:33
WinMain, а как можно удалить память внутри функции, ведь потом надо возвратить строку, под которую эта память выделялась.
А насчет статических массивов - это ж прога в универ, там преподы требуют чтоб делали именно так, а сами объяснять ниче не хотят...

WinMain
30.11.2005, 15:03
В остальных функциях у тебя в качестве пареметра передаётся указатель на строку. Вот и в функцию fillrand() передавай его как параметр. А выделение памяти убери из fillrand() и перенеси в функцию main().

shpi0
30.11.2005, 15:28
Попробовал так сделать...


char *fillrand(int k,char *s_random)
{
int i;
for (i=0;i<k;i++)
s_random[i]=random(25)+97;
s_random[k] = 0;
return s_random;
}
И main:

main()
{
clrscr();
randomize();
int k=1000;
char *s = new char[k+1];
char *sorted = new char[k+1];
unsigned long sum;
unsigned int runnumb;
s=fillrand(k,s);
FILE *f=fopen(filename,"w+");
if (f==NULL)
{
printf("\nCant open file!");
getche();
return 0;
}
printf("%d %s\n\n%d %s\nReady.\n\n",strlen(s),s,strlen(sorted),sorted);
// fputs(s,f);
// fputs("\n\n",f);
sorted=shakersort(s);
// fputs(sorted,f);
fclose(f);
printf("%d %s\n\n%d %s\nReady.",strlen(s),s,strlen(sorted),sorted);
delete[] sorted;
delete s;
getche();
return 1;
}
Для sorted надо тоже память выделять? Сам-то массив у меня генерируется, а вот с функцией сортировки shakersort что-то не то... Ее когда вызываю, у меня и s и sorted становятся строками из одного символа (сам алгоритм рабочий).

WinMain
30.11.2005, 15:41
Функция shakersort() возвращает указатель на строку s, поэтому для sorted выделять память не нужно. Да и вообще эта переменная здесь лишняя.

shpi0
30.11.2005, 16:24
У меня в shakersort() что-то неправильно? Она строку просто обрезает до одного символа, еще в первом цикле
for (j=r;j>l;j--)
if (st[j]<st[j-1])
{
buf=st[j];
st[j]=st[j-1];
st[j-1]=buf;
}

shpi0
01.12.2005, 12:01
Вопрос снят, тока щас дошло что это из-за того что последний символ 0... ))) Щас буду делать еще куча тупых вопросов появится...