Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 70 из 87<  1 ... 67  68  69  70  71  72  73 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 09.01.2009
Откуда: Москва
Root писал(а):
Вы вообще понимаете смысл слова "статический"?

Понял, что глупость сказал.

Вот есть функция, в которой создается стат. массив( int B[N]; ). И вот как-то этот массив надо передать в моем случае в main.



Партнер
 

Member
Статус: Не в сети
Регистрация: 06.05.2009
Откуда: Украина, Донецк
Попробуй создать массив с модификатором static, тогда он не удалится после выхода из функции, а в main передашь его адрес:

Код:
int* Funct()
{
   static int mas[5];
   //...
   return mas;
}

void main()
{
   int *mas;
   mas = Funct();
}


 

Member
Статус: Не в сети
Регистрация: 09.01.2009
Откуда: Москва
А еще есть способ? static нельзя использовать по условию задачи :(


 

Member
Статус: Не в сети
Регистрация: 06.05.2009
Откуда: Украина, Донецк
Ну тогда ток с указателями и с динамическим распределением памяти, без них по идее уже никак.


 

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, а так как он не инициализирован, то это будет адрес "в космосе", на который ссылается этот указатель, то есть попросту мусор. Сам когда-то наступил на эти грабли, вот и запомнилось.


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
вообще-то можно создавать статические массивы глобально, тогда они никуда не пропадут


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
sprata
да, Вы правы. :-)

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Junior
Статус: Не в сети
Регистрация: 04.07.2010
Откуда: г. Жел-дор
Фото: 1
Если тема еще актуальна, вот моя лабораторная работа с первого курса по Си на тему базы данных. :)
http://zalil.ru/30045381


 

Junior
Статус: Не в сети
Регистрация: 26.01.2008
Откуда: Ukraine
Доброго времени суток.

Можете пожалуйста помочь с кодом. Задание: записать сначала просто в файл данные(бинарным способом), потом в любой созданный поток файла. Тоесть, например сначала в zaz.txt а потом в zaz.txt:first.
С записью просто в файл все в порядке, а вот с потоком проблемы. Может я чего-то не понимаю?

п.с. Проверку прохожу в блокноте, копирую с места проекта текстовый файл и запускаю с диска с в консоли. Оба диска в ntfs.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int main(void){

   setlocale(LC_ALL, ".1251");
   FILE *f;
   f=fopen(".\\zaz.txt:1","wb");

   int size=fwrite("name11",1,6,f);
   fclose(f);
   printf("%d",size);
}



п.с. Проблема снята. :-) Все ок.


 

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;
}


вот только в ООП я не силён(((

_________________
исследование потоков внутри корпуса: http://forums.overclockers.ru/viewtopic ... t=#5737015


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
uoppвам нужен класс написать?так для этого и класс особо не нужен

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 14.11.2004
Откуда: EMEA
Russian
вот в том-то и дело, куда тут классы приписать вообще не понятно. особенно иерархию классов применительно к именно этому заданию

_________________
исследование потоков внутри корпуса: http://forums.overclockers.ru/viewtopic ... t=#5737015


 

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
Статус: Не в сети
Регистрация: 10.12.2007
Откуда: Санкт-Петербург
Добрый вечер
Имеется такой для примера коД
Код:
   int i = 0;
   while (1) {
      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);
   }

При попытке освобождения arglist все падает. Почему?

_________________
Семь бед, один Reset. 95, 98 - это количество багов. В пpоцентах...
DCN - наше все


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
manyaтолько что собрал ваш кусок кода и ничего не упало

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 14.11.2004
Откуда: EMEA
Russian
Спасибо), но в этом случае от ООП только создание класса. А смысл программы показать хоть что-то из идеологии ООП, чтобы там кто-то что-то наследовал и т.д. и т.п.

_________________
исследование потоков внутри корпуса: http://forums.overclockers.ru/viewtopic ... t=#5737015


 

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.

_________________
Задачи бывают простыми и очень простыми...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 70 из 87<  1 ... 67  68  69  70  71  72  73 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan