array = alloc(n*n); //для матрицы n на n
и так ошибка на ошибке, пусть они в остальном коде будут, его вы хоть проверить сможете...
Модератор: Модераторы разделов
array = alloc(n*n); //для матрицы n на n
drBatty писал(а): ↑01.11.2008 03:06Эх блин... Столько распинался... А вы так ничего не поняли...
ну не вернётся память обратно!!! вернётся только массив из m указателей на указатели. А m массивов doublе так и останется висеть оторванным ладно было бы C++, мы бы деструктор к элементам array написали, он m раз выполнился и m массивов удалил... А так... Эх...
array = alloc(n*n); //для матрицы n на n
и так ошибка на ошибке, пусть они в остальном коде будут, его вы хоть проверить сможете...
а что есть? 50-80% времени сишный кодер работает над выделением памяти, а у него на то одна функция, да и так - не рекомендуется... Или new/delete теперь и в си есть? да и потом не важно, alloc() - просто функция которая возвращает кусок памяти, как - вопрос десятый.
drBatty писал(а): ↑03.11.2008 02:46Ваша программа будет работать, пока ей памяти хватит. пока вы её будете тестировать. а вот рухнет она в самый неудобный момент, и вам придётся приехать и разобраться... просто все сишные распределители памяти сложно тестировать, и по этому их нужно делать как можно более простыми и понятными.
да в том то и дело, что нет!
Код: Выделить всё
// Ввод массива
printf("Введите мaссив размерностью %d x %d (q-выход):\n", m, n);
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
status = scanf("%lf", &array[i][j]);
}
if (status!=1)
{
free(array);
return 0;
}
}
а если мы введём 3 4 a, функция scanf считает только до пробела, то есть число 3 и программа продолжит работу.
Что не так с логикой?
Код: Выделить всё
#include <stdio.h>
int main(){
int N,M; //N- количество строк, M-количество стобцов.
printf("Введи количество строк матрицы A:");
scanf("%d",&N);
printf("Введи количество столбцов матрицы A:");
scanf("%d",&M);
int** A;
A= new int*[N];
//Ввод матрицы
int i,j;
for (i=0;i<N;i++)
{ A[i]=new int[M];
for(j=0;j<M;j++)
{
scanf("%d",&A[i][j]);
}
}
//Вывод введенной матрицы
printf("Введенная матрица:");
for (i=0;i<N;i++)
{
A[i]=new int[M];
for(j=0;j<M;j++)
{
printf("%d\t",&(A[i][j])); //Смотреть сюда
}
printf("\n");
}
delete []A;
return 0;
}
scanf считывает символы из потока ввода до первого символа пробела, табуляции, символа новой строки и т.д. для каждого адреса.
Если адресов больше чем 1, то функция продолжит считывать во второй адрес
(не буквенно-цифровые символы останавливают считывание данных в один адрес)
Если считанный символ не соответствует спецификатору, scanf возвращает NULL.
Поэтому a 2 3 остановит программу, а 1 b 3 запишет в переменную значение 1.
Код: Выделить всё
#include <stdio.h>
main()
{
int i;
double n = 0.0;
for (i = 0; i < 10; i++)
scanf("%lf", &n);
printf("%f\n", n);
printf("%d\n", i);
return 0;
}
Код: Выделить всё
[guest@localhost tmp]$ ./t
a
0.000000
10
[guest@localhost tmp]$ ./t
1 2 3 4 5 6 7 8 9 10.1
10.100000
10
[guest@localhost tmp]$
Буква нигде не появится, как только будет считана буква, программа завершится
Код: Выделить всё
printf("%d\t",&(A[i][j])); //Смотреть сюда
выполняет return 0 из программы, символизируя этим самым, что программа закончилась успешно
Код: Выделить всё
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
status = scanf("%lf", &array[i][j]);
if (status!=1)
{
free(array);
return 0;
}
}
}
Не обязательно. exit(0) символизирует, что программа закончилась успешно.
Код: Выделить всё
[guest@localhost tmp]$ ls
1 code for_funcs music save test.c
[guest@localhost tmp]$ find . -name test.c
./test.c
[guest@localhost tmp]$ echo $?;
0
[guest@localhost tmp]$ find . -name none
[guest@localhost tmp]$ echo $?;
0
[guest@localhost tmp]$
Код: Выделить всё
[guest@localhost tmp]$ echo abc | grep a
abc
[guest@localhost tmp]$ echo $?
0
[guest@localhost tmp]$ echo abc | grep d
[guest@localhost tmp]$ echo $?
1
[guest@localhost tmp]$
Вы привязались к какой-то ерунде.
Код: Выделить всё
free(array);
Код: Выделить всё
int tmp;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
status = scanf("%lf", &array[i][j]);
if (status!=1)
{
for (tmp = 0; tmp < n; tmp++)
free(array[tmp]);
free(array);
return 0;
}
}
}
Код: Выделить всё
int tmp;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
if (!scanf("%lf", &array[i][j])) {
for (tmp = 0; tmp < n; tmp++)
free(array[tmp]);
free(array);
return 0;
}
}
}
Код: Выделить всё
int tmp;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
if (scanf("%lf", &array[i][j]) != 1) {
for (tmp = 0; tmp < n; tmp++)
free(array[tmp]);
free(array);
return 0;
}
}
}
ага, повторяем ошибки, ладно это я спишу на то что ты/вы просто не дошёл до функций выделения и освобождения памяти, потому не знаешь как там надо сделать
два варианта тебе посылаю, ещё обратил внимание что ты там то return 0 то exit(EXIT_FAILURE) используешь, в чём логика ?
я имею в виду почему не exit(EXIT_SUCCESS) вместо return 0, или не return 1 вместо exit(EXIT_FAILURE)
Код: Выделить всё
for (t=0; t<m; i++)
{
free(array[t]); // Возвращаем память для каждого вектора из n элементов, т.к array[t] указатель на этот вектор
}
free(array); // Возвращаем память для вектора из m элементов
Чтото я притормаживаю. Работал на Turbo C под дос, всегда printf требовал аргументов-указателей.
Код: Выделить всё
int n;
printf("123%n", &n);
Если не хватило памяти, то это значит, что программа отработала неудачно, поэтому EXIT_FAILURE. EXIT_FAILURE, а не 1 для переносимости программы.\
Может всё же надо делать так:
Код: Выделить всё
int tmp;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
printf("(%d,%d) ", i+1, j+1);
if (scanf("%lf", &array[i][j]) != 1) {
for (tmp = 0; tmp < m; tmp++)
free(array[tmp]);
free(array);
return 0;
}
}
}
Код: Выделить всё
#include <cstdio>
main()
{
void change(int *, int &);
int n1, n2;
n1 = n2 = 0;
printf("%d %d\n", n1, n2);
change(&n1, n2);
printf("%d %d\n", n1, n2);
return 0;
}
void change(int *a, int& b)
{
*a = 2;
b = 3;
}
Код: Выделить всё
[guest@localhost tmp]$ g++ t.cpp -o t
[guest@localhost tmp]$ ./t
0 0
2 3
[guest@localhost tmp]$
Код: Выделить всё
int i,a,b,z,k;
printf("кол-во столбцов,кол-во строк\n");
scanf("%d,%d",&a,&b);
float **y=new float* [b];
for(i=0;i<b;i++)
y[i]=new float[a+b];
for(l=1,z=0;l<b+1;l++,z++)
{
printf("\n \t\t\t\tstroka %d\n",l);
for(i=0,k=1;i<a,k<a+1;i++,k++)
{printf("vvedite koef pri x%d \n",k);
scanf("%f",&y[z][i]);
}
for(k=0;k<b;k++) //вывод
{
printf("\n");
for(i=0;i<a+b;i++)
printf("%f ",y[k][i]);