Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
erro1
0 / 0 / 0
Регистрация: 14.11.2010
Сообщений: 10
#1

Передать в функцию размер массива указателей - C++

28.02.2011, 21:53. Просмотров 1832. Ответов 8
Метки нет (Все метки)

Всем привет. Есть массив указателей допустим char *array[] = { "строка 1", "строка 2"... "строка n" }
Нужно предать его размер (sizeof()) в функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <curses.h>
#include "my_header.h"
 
 
using namespace std;
 
int i, g_Choice = 0;
 
char *main_menu[] = {
                 "1. Add item",
                 "2. Delete item",
                 "3. Tasks",
                 "3. Enter as Admin",
                 "4. Register an Admin",
                 "5. Display all",
                 };
 
void menu()
{
    int menu_pointer = 1;
    int ch;
    int n_choices = sizeof(main_menu)/sizeof(char *);
 
    keypad(stdscr,TRUE);
    show_menu(menu_pointer, n_choices, main_menu);
    while(TRUE)
    {
        ch = getch();
        switch(ch)
        {   case KEY_UP:
                if(menu_pointer == 1)
                    menu_pointer = n_choices;
                else
                    --menu_pointer;
                break;
            case KEY_DOWN:
                if(menu_pointer == n_choices)
                    menu_pointer = 1;
                else
                    ++menu_pointer;
                break;
            case 10:   // "Enter" key
                g_Choice = menu_pointer;
                break;
        }
        show_menu(menu_pointer, n_choices,main_menu);
        if(g_Choice != 0)     /* Choice is done,come out of the infinite loop */
            break;
    }
    //printw("Your choice is \"%s\" ",main_menu[choice-1]);
    refresh();
}
 
int main()
{
    b   = new book[books_count];
    adm = new admin[admin_count];
    initscr();  // Initiliazation
    cbreak();   // Line buffering disabled
    noecho();
    attron(A_BOLD);     // Bold text
   
    getch();
    endwin();
 
}
хочу что-то типо
C++
1
void menu(*char what_menu) // везде вместо main_menu будет what_menu, чтобы создавать меню из любых массивов
но sizeof(what_menu) мне выводит 1 (вместо 20 (5*4))
my_header.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void show_menu(int highlight, int choice_count, char* choices[])
{
    int x;
    clear(); start_color();
    if(has_colors() == FALSE)
    {   endwin();
        printf("Your terminal does not support color\n");
    }
    init_pair(2, COLOR_GREEN,  COLOR_BLACK);
    x = 2;
    for(int i = 0; i < choice_count; i++)
    {
        if(highlight == i + 1)              /* High light the present choice */
        {
             attron(COLOR_PAIR(2));
             mvprintw(x,3,"%s \n", choices[i]);
             attroff(COLOR_PAIR(2));
        }
        else mvprintw(x,3,"%s \n", choices[i]);
        x+=2;
    }
    refresh();
}
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2011, 21:53     Передать в функцию размер массива указателей
Посмотрите здесь:

C++ Передача двумерного массива указателей в функцию
C++ Как передать в функцию двумерный массив указателей на класс?
C++ Как передать массив в функцию не указывая размер
Ввести размер массива с клавиатуры и передать этот размер в конструктор C++
Размер массива при передачи в функцию C++
Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива C++
Передать двумерный массив указателей в функцию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
28.02.2011, 22:02     Передать в функцию размер массива указателей #2
Всем привет. Есть массив указателей допустим char *array[] = { "строка 1", "строка 2"... "строка n" }
Нужно предать его размер (sizeof()) в функцию.
int i = sizeof(char) * n;
n - размерность массива
erro1
0 / 0 / 0
Регистрация: 14.11.2010
Сообщений: 10
28.02.2011, 22:16  [ТС]     Передать в функцию размер массива указателей #3
размерность массива неизвестна, ( n-ое кол-во строк разной длины)
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2011, 02:45     Передать в функцию размер массива указателей #4
Цитата Сообщение от erro1 Посмотреть сообщение
хочу что-то типо
C++
1
void menu(*char what_menu) // везде вместо main_menu будет what_menu, чтобы создавать меню из любых массивов
но sizeof(what_menu) мне выводит 1 (вместо 20 (5*4))
раз пишешь на C++, то можешь использовать вектор, он там сам знает свой размер
но если именно массив нужен, то передавай размер сбоку

C
1
void menu(char **what_menu, size_t nitems);
где вызов получается таким
C
1
menu(main_menu, sizeof main_menu / sizeof main_menu[0]);
кстати, вполне вероятно, что можно передавать массив по ссылке, тогда может быть даже можно размер узнать внутри функции
попробовал - массив по ссылке передать не получилось
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
01.03.2011, 03:21     Передать в функцию размер массива указателей #5
можно сделать массив массивов
один и них фиксированый
char name[256];

char * menu=new sizeof(name)*k;

потом где надо sizeof(menu)/sizeof(name)

Цитата Сообщение от accept Посмотреть сообщение
sizeof main_menu / sizeof main_menu[0]
низзяя потому-что
( n-ое кол-во строк разной длины)
sizeof main_menu[0] может быть не равно sizeof main_menu[1]
поэтому длину строки лучше сделать фиксированной
или пользоваться классами для этого предназначеными
например
массив string
С уважением Валерий

Добавлено через 3 минуты
Цитата Сообщение от erro1 Посмотреть сообщение
char *main_menu[] = {
а не так ли его надо объявлять main_menu[] []

Добавлено через 7 минут
Во че я придумал
пройти циклом по буферу подсчитать количество 0
это и будет количество строк
указатель на следующюю строку следующий после указателя на 0
но по моему это изврат
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2011, 03:52     Передать в функцию размер массива указателей #6
Цитата Сообщение от ValeryS Посмотреть сообщение
низзяя потому-что

sizeof main_menu[0] может быть не равно sizeof main_menu[1]
неужели ?

( n-ое кол-во строк разной длины)
автор подумал, что ему нужно строки передавать, но ему не нужно строки передавать
char *main_menu[] = { - это массив указателей и sizeof main_menu[0] == sizeof main_menu[any]

Добавлено через 2 минуты
Цитата Сообщение от ValeryS
можно сделать массив массивов
один и них фиксированый
char name[256];

char * menu=new sizeof(name)*k;

потом где надо sizeof(menu)/sizeof(name)
в предложенном случае остаётся массив name, который используется только для вычисления размера, а зачем его делать, если вместо него можно было бы определить переменную int, в которую сразу записать размер ?

Добавлено через 1 минуту
Цитата Сообщение от ValeryS
например
массив string
например, делается вектор, а что там string или не string - неважно
ValeryS
Модератор
6482 / 4948 / 455
Регистрация: 14.02.2011
Сообщений: 16,389
01.03.2011, 05:47     Передать в функцию размер массива указателей #7
-Болван
-Согласен
(с)
я чей то не вкурил что будет массив указателей

Добавлено через 5 минут
В оригинале кстати массив глобальный ( о чем мы в другой ветке говорили)
так что его можно и не передавать а обращаться напрямую из любой функции
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.03.2011, 07:00     Передать в функцию размер массива указателей #8
функция может использовать глобальный массив, а функция с передаваемым массивом может использовать любой массив
предположим, что он сделал функцию для глобального массива, и что, это одна функция, которая может использовать один массив
а вот сделав функцию с передаваемым массивом, он легко может сделать несколько меню, занести их в локальную область также легко и не следить, где у него и что

у него не хватает там значения, которое должна возвращать эта функция (для чего она и создаётся)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2011, 15:55     Передать в функцию размер массива указателей
Еще ссылки по теме:

C++ как передать в функцию координаты массива?
Как правильно передать динамический массив в функцию, увеличивающую его размер, чтобы изменения сохранились C++
C++ Передача массива указателей в функцию для выделения памяти
C++ Посимвольно передать элементы массива в функцию
C++ Инициализация массива указателей на функцию

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
erro1
0 / 0 / 0
Регистрация: 14.11.2010
Сообщений: 10
01.03.2011, 15:55  [ТС]     Передать в функцию размер массива указателей #9
Сделал как в 4 посте. Хотел покомпактней сделать
Yandex
Объявления
01.03.2011, 15:55     Передать в функцию размер массива указателей
Ответ Создать тему
Опции темы

Текущее время: 07:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru