1 Востаннє редагувалося Ярослав (09.05.2013 07:47:37)

Тема: Область видимості змінної і динамічне визначення розміру масиву

Вітаю!
Задача полягає в тому щоб спочатку за допомогою вводу визначити розмір масиву, але при цьому доступ до нього має бути в усіх функціях тобто:

#include
#define

int array[x];

int main(){
}

int input(){
    int x = 2;
}

2

Re: Область видимості змінної і динамічне визначення розміру масиву

malloc вам у руки!

3

Re: Область видимості змінної і динамічне визначення розміру масиву

Не розумію ваших натяків + іще не маю досвіду користування цією функцією.
Приведіть будь ласка простий код, де в функції визначається розмір, а потім створюється "зовнішній" масив на цей розмір.

4

Re: Область видимості змінної і динамічне визначення розміру масиву

int * array = malloc(x * sizeof(int));
if (array == NULL) {
    /* обробка помилки */
}

взагалі то приклад звідси

5

Re: Область видимості змінної і динамічне визначення розміру масиву

Не вшарив суть.
Вам потрібно глобальний динамічний масив?

int *arr = 0;
int size = 0;

void input()
{
    size = 1988;
}

int main()
{
    input();
    arr = new int[size];// або malloc(sizeof(int)*size);
//...

    delete arr;// або free(arr);
return 0;
}

6

Re: Область видимості змінної і динамічне визначення розміру масиву

Доречі ще є calloc. Я чомусь більше ним користувався.

7

Re: Область видимості змінної і динамічне визначення розміру масиву

calloc() має плюс, що її виклик виглядає приємніше для програміста й обнуляє блок даних. По факту це - обгортка над malloc+memset:

 /* $Header: /opt/proj/minix/cvsroot/src/lib/ansi/calloc.c,v 1.1.1.1 2005/04/21 14:56:04 beng Exp $ */
#include        <stdlib.h>

define ALIGN(x)        (((x) + (sizeof(size_t) - 1)) & ~(sizeof(size_t) - 1))
 
void *calloc(size_t nelem, size_t elsize)
 {
        register char *p;
        register size_t *q;
        size_t size = ALIGN(nelem * elsize);
 
        p = malloc(size);
        if (p == NULL) return NULL;
        q = (size_t *) (p + size);
        while ((char *) q > p) *--q = 0;

        return p;
}

8

Re: Область видимості змінної і динамічне визначення розміру масиву

Мені потрібно створити масив із масивів покажчиків на char.
Я роблю це так:

char *lineptr[5][10]

І виходить, що маю 5 масивів по 10 покажчиків на char
Як можна динамічно визначити його розмірність, якщо цей масив буде глобальним?
Відкопав отаку статейку:
http://pleasemakeanote.blogspot.com/200 … alloc.html
Але я іще плутаюсь у поняттях.

9 Востаннє редагувалося koala (16.05.2013 19:21:26)

Re: Область видимості змінної і динамічне визначення розміру масиву

Як можна динамічно визначити його розмірність

Відповідь неочікувана: ніяк. C/C++ не зберігає інформацію про розмірність масиву під час виконання, тому динамічно визначити можна тільки якщо зберігати її окремо самому.
Короткий лікнеп по масивах C/C++:
- ім'я масиву завжди, крім оператора sizeof, повертає посилання на перший елемент масиву. a == &a[0].
- немає багатовимірних масивів - є масиви масивів, масиви посилань і т.ін.
- масив масивів в пам'яті тотожний одновимірному масиву:
a[5][10] - те саме, що й a[50]. Адресація при цьому очевидна: a [ i ][j] == a [10*i+j].
- кількість елементів в статичному масиві можна визначити як sizeof(a)/sizeof(a[0]). Але в випадку масиву масивів це поверне кількість підмасивів, а не елементів! В вашому випадку можна записати sizeof(lineptr)/sizeof(char *), але тоді ви не отримаєте інформації про підрозміності. Ні, звісно, можна погратися в щось типу

char *lineptr[5][10];
int first_dim = sizeof(lineptr)/sizeof(lineptr[0]),
    sec_dim = sizeof(lineptr[0])/sizeof(lineptr[0][0]);

Але ви певні, що вам воно треба? Тим більше, що для цього всього треба точно знати, що це масив масивів, а не масив масивів масивів.

Так, і ще є стандартні типи array і vector; може, із ними буде зручніше? Вони розмір зберігають.
Ну і

const int first_dim=5,
          sec_dim=10;
char *lineptr[first_dim][sec_dim];

10

Re: Область видимості змінної і динамічне визначення розміру масиву

Ярославе, розмірність такого масиву на верхньому рівні ви визначити зможете однозначно (за прикладом від koala, sizeof'ами). А нижче при динамічних масивах немає гарантії, що підмасиви не будуть "рваними". Інша справа - статичні масиви, бо у них розмір задається на етапі компіляції.

Ярослав написав:

Мені потрібно створити масив із масивів покажчиків на char.

Якщо не секрет: для чого вам потрійні покажчики? :)