Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
0 / 0 / 1
Регистрация: 14.11.2010
Сообщений: 10

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

28.02.2011, 21:53. Показов 3167. Ответов 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();
}
Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.02.2011, 21:53
Ответы с готовыми решениями:

Передать массив указателей в функцию по ссылке
Здравствуйте. Подскажите пожалуйста как передать массив указателей в функцию так, чтобы при изменении этих указателей в функции изменения...

Передать двумерный массив указателей в функцию
Здравствуйте) У меня есть класс Tile и структура Room. Примерно они выглядят таким образом: class Tile { private: ...

Ввести размер массива с клавиатуры и передать этот размер в конструктор
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...

8
 Аватар для Dimarik__
21 / 21 / 3
Регистрация: 29.04.2010
Сообщений: 444
28.02.2011, 22:02
Всем привет. Есть массив указателей допустим char *array[] = { "строка 1", "строка 2"... "строка n" }
Нужно предать его размер (sizeof()) в функцию.
int i = sizeof(char) * n;
n - размерность массива
0
0 / 0 / 1
Регистрация: 14.11.2010
Сообщений: 10
28.02.2011, 22:16  [ТС]
размерность массива неизвестна, ( n-ое кол-во строк разной длины)
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.03.2011, 02:45
Цитата Сообщение от 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]);
кстати, вполне вероятно, что можно передавать массив по ссылке, тогда может быть даже можно размер узнать внутри функции
попробовал - массив по ссылке передать не получилось
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
01.03.2011, 03:21
можно сделать массив массивов
один и них фиксированый
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
но по моему это изврат
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.03.2011, 03:52
Цитата Сообщение от 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 - неважно
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
01.03.2011, 05:47
-Болван
-Согласен
(с)
я чей то не вкурил что будет массив указателей

Добавлено через 5 минут
В оригинале кстати массив глобальный ( о чем мы в другой ветке говорили)
так что его можно и не передавать а обращаться напрямую из любой функции
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.03.2011, 07:00
функция может использовать глобальный массив, а функция с передаваемым массивом может использовать любой массив
предположим, что он сделал функцию для глобального массива, и что, это одна функция, которая может использовать один массив
а вот сделав функцию с передаваемым массивом, он легко может сделать несколько меню, занести их в локальную область также легко и не следить, где у него и что

у него не хватает там значения, которое должна возвращать эта функция (для чего она и создаётся)
1
0 / 0 / 1
Регистрация: 14.11.2010
Сообщений: 10
01.03.2011, 15:55  [ТС]
Сделал как в 4 посте. Хотел покомпактней сделать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2011, 15:55
Помогаю со студенческими работами здесь

Как передать в функцию двумерный массив указателей на класс?
у меня есть std::vector&lt;Monster*&gt; monsters; Rect *pole; int pacmen_distance; Monster и Rect два...

Как передать массив в функцию не указывая размер
Хочу сделать функцию для сортировки массивов с разным размером как передать массив в функцию не указывая его размер ?

Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива
Создайте новую версию класса Stack с конструктором по умолчанию и вторым конструктором, в аргументах которого передается массив указателей...

Инициализация массива указателей на функцию
При попытке инициализировать массив указателей на функцию возникает ошибка, не могу разобраться в чем она и как решить её. Заранее...

Передача двумерного массива указателей в функцию
Всем здравствуйте! Мне необходимо создать что-то вроде справочной системы по операторам языка С++. Теорию я храню в таком виде: ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru