Member
Статус: Не в сети Регистрация: 09.01.2009 Откуда: Москва
И с динамическим распределением памяти тоже проблема. Выделяю память для массива в функции 1 и передаю адрес в main. Из main передаю адрес в другую функцию 2. Пробовал освободить память ( delete [] mas; ) и в main после работы второй функции и в конце второй функции, но вылазит ошибка.
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
test'~3
Код:
void create_array (char *mas, long int &number_of_elements) { ... number_of_elements = ... mas = malloc(number_of_elements * sizeof(char)); ... }
void do_smth(char *mas, const long int number_of_elements) { ... }
void main (void) { char *mas; long int number_of_elements; create_array(mas, number_of_elements); if (mas == NULL) { // ошибка. убиваем себя об стенку. } do_smth(mas, number_of_elements); free(mas); }
можно вместо того, чтобы везде таскать кол-во элементов массива просто придумать элемент, который будет маркером конца (напр., "/0" для конца строки). Работает по аналогии с тем, как работают функции работы со строками в Си.
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Member
Статус: Не в сети Регистрация: 06.05.2009 Откуда: Украина, Донецк
Root, могу ошибаться, сейчас нет возможность проверить, но по моему у вас в коде ошбика. В функцию create_array нужно передать не сам указатель, а адрес указателя, под который будет выделяться память в функции:
Цитата:
void create_array (char **mas, long int &number_of_elements) { ... number_of_elements = ... *mas = malloc(number_of_elements * sizeof(char)); ... }
void do_smth(char *mas, const long int number_of_elements) { ... }
void main (void) { char *mas; long int number_of_elements; create_array(&mas, number_of_elements); if (mas == NULL) { // ошибка. убиваем себя об стенку. } do_smth(mas, number_of_elements); free(mas); }
Если же передать просто mas, как было у вас, то в функцию create_array передастся содержимое указателя mas, а так как он не инициализирован, то это будет адрес "в космосе", на который ссылается этот указатель, то есть попросту мусор. Сам когда-то наступил на эти грабли, вот и запомнилось.
Junior
Статус: Не в сети Регистрация: 26.01.2008 Откуда: Ukraine
Доброго времени суток.
Можете пожалуйста помочь с кодом. Задание: записать сначала просто в файл данные(бинарным способом), потом в любой созданный поток файла. Тоесть, например сначала в zaz.txt а потом в zaz.txt:first. С записью просто в файл все в порядке, а вот с потоком проблемы. Может я чего-то не понимаю?
п.с. Проверку прохожу в блокноте, копирую с места проекта текстовый файл и запускаю с диска с в консоли. Оба диска в ntfs.
Member
Статус: Не в сети Регистрация: 14.11.2004 Откуда: EMEA
Доброго времени суток... Есть такая проблема - написать в объектах программу (Borland C++Builder 6, win), которая заполняет квадратную матрицу порядка n натуральными числами 1, 2, 3, … n2, записывая их в нее «по спирали». Например, для n = 5 получаем следующую матрицу: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9
собственно в диалоговом окне вводится n, жмётся кнопка и рисуется матрица на экране.
Код:
//Алгоритм заполнения матрицы по спирали. #include "stdafx.h" #include <iostream> using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { int const n=11; int A[n][n]; int i=1,j,k,p=n/2; for(k=1;k<=p;k++)/*Цикл по номеру витка*/ { for (j=k-1;j<n-k+1;j++) A[k-1][j]=i++;/*Определение значений верхнего гор столбца*/ for (j=k;j<n-k+1;j++) A[j][n-k]=i++;/* --//-- По правому вертикальному столбцу*/ for (j=n-k-1;j>=k-1;--j) A[n-k][j]=i++;/* --//-- по нижнему горизонтальному столбцу*/ for (j=n-k-1;j>=k;j--) A[j][k-1]=i++;/* --//-- по левому вертикальному столбцу*/ } if (n%2==1) A[p][p]=n*n; for(i=0;i<n;i++) for(j=0;j<n;j++) { printf(" %4d ",A[i][j]); if(j==n-1) printf(" "); }
}
или
Код:
int _tmain(int argc, _TCHAR* argv[]) { // инициализация int x=0, n=64, m=15, q=8, d=8; int a[8][8]; int newd[17]; newd[0] = -1; newd[7] = 8; newd[9] = -8; newd[16] = 1;
// заполнение while (n) { a[x >> 3][x & 7] = 65 - n--; if (!(--q)) { q = (m--) >> 1; d = newd[d+8]; } x += d; }
// вывод на экран for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { std::cout << a[i][j] << " "; } std::cout << std::endl; } return 0; }
Member
Статус: Не в сети Регистрация: 08.05.2006 Откуда: СПБ
Код:
#include <iostream> #include <stdio.h> using namespace std;
class matrix{ public: matrix(int n) { int A[n][n]; int i=1,j,k,p=n/2; for(k=1;k<=p;k++)/*Цикл по номеру витка*/ { for (j=k-1;j<n-k+1;j++) A[k-1][j]=i++;/*Определение значений верхнего гор столбца*/ for (j=k;j<n-k+1;j++) A[j][n-k]=i++;/* --//-- По правому вертикальному столбцу*/ for (j=n-k-1;j>=k-1;--j) A[n-k][j]=i++;/* --//-- по нижнему горизонтальному столбцу*/ for (j=n-k-1;j>=k;j--) A[j][k-1]=i++;/* --//-- по левому вертикальному столбцу*/ } if (n%2==1) A[p][p]=n*n; for(i=0;i<n;i++) for(j=0;j<n;j++) { printf(" %4d ",A[i][j]); if(j==n-1) printf("\n"); } };
};
int main() { matrix(5); return 0; }
_________________ Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс
Member
Статус: Не в сети Регистрация: 14.11.2004 Откуда: EMEA
Russian Спасибо), но в этом случае от ООП только создание класса. А смысл программы показать хоть что-то из идеологии ООП, чтобы там кто-то что-то наследовал и т.д. и т.п.
Member
Статус: Не в сети Регистрация: 10.12.2007 Откуда: Санкт-Петербург
Russian спасибо А у меня падает и в винде( "This may be due to a corruption of the heap, which indicates a bug"), и в линуксе( "ошибка сегментации") при попытке освобождения
Добавлено спустя 19 минут 3 секунды:
manya писал(а):
Код:
while (1) { int i = 0; char *str = (char *)malloc(N); while ((str[i++] = getchar()) != '\n'); str[i] = '\0'; char *arglist[N]; for (i = 0; i<N; i++) arglist[i] = (char *)malloc(N); i = 0; char *p = NULL; p = strtok(str, " "); strcpy(arglist[i], strdup(p)); while ((p = strtok(NULL, " ")) != NULL) { strcpy(arglist[++i], strdup(p)); } for (i = 0; i<N; i++) //при первом же заходе сюдЫ падает free(arglist); free(p); }
_________________ Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах... DCN - наше все
Member
Статус: Не в сети Регистрация: 20.03.2009 Откуда: Санкт-Петербург
manya писал(а):
for (i = 0; i<N; i++) free(arglist);
Вот ошибка. Вы пытаетесь N раз освободить память по адресу arglist. А именно при первой попытке падало потому, что сам arglist не выделяется в куче динамически. Правильно так:
Код:
for (i = 0; i<N; i++) free(arglist[i]);
Добавлено спустя 5 минут 22 секунды:
uopp писал(а):
там кто-то что-то наследовал и т.д. и т.п.
Можно сделать базовый класс матрицы, у него в методах виртуальный get_elm и set_elm. А так же в размеры самой матрицы, ну и для них гет/сет. От него унаследовать Square_Matrix.
_________________ Задачи бывают простыми и очень простыми...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения