1 Востаннє редагувалося Teg Miles (22.08.2018 21:56:25)

Тема: Глобальна змінна

Є дві функції bool load(const char* dictionary), яка завантажує словник з файлу до буферу в пам'яті, та
unsigned int size(void), яка визначає кількість слів у цьому словнику. Як мені створити глобальну змінну з цим словником, щоб я мав до неї доступ і з інших функцій? Мова С.

2

Re: Глобальна змінна

Глобальна змінна проголошується на тому ж рівні, що й функції. Якщо вона проголошується раніше за функцію, то функція має до неї доступ.
Єдина проблема - це як проголосити глобальну змінну в одному файлі, щоб до неї був доступ з інших. Для цього змінна проголошується в одному місці, а в решті проголошення повторюється із ключовим словом extern - це пояснення компілятору, що деінде така змінна існує, але точне місце підкаже лінкер. Часто extern-проголошення виносять в .h-файл.
А взагалі глобальні змінні - зло.

Подякували: FakiNyan, Teg Miles, leofun013

3 Востаннє редагувалося ReAl (28.08.2018 21:05:05)

Re: Глобальна змінна

koala написав:

А взагалі глобальні змінні - зло.

Ну якщо вона «глобальна у файлі», але схована static-ом від інших файлів, то для відповідного модуля це те ж саме, що private-static член класу для С++, тому однозначно «зло» я не казав би.

Хоча тут і краще було б

// dictionary.h
struct dictionary; // саме так, лише forward declaration, це приватна справа dictionary.c
struct dictionary *create_dictionary();
void free_dictionary(struct dictionary *p);

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

Але у даному конкретному випадку код, який перевіряє завдання, розрахований на те, що словник один і десь схований («глобальний у іншому файлі»). Всі виклики (створення dictionary з текстового файлу, звільнення пам'яті) на це розраховані.

Подякували: Teg Miles, leofun01, varkon3

4

Re: Глобальна змінна

С це таке зло, там і "самому собі ногу можна прострелити"

5

Re: Глобальна змінна

reverse2500 написав:

С це таке зло, там і "самому собі ногу можна прострелити"

А що, існують мови, де це неможливо? (ну хіба крім Scratch-а)

6

Re: Глобальна змінна

зараз багато сучасних мов програмування самі слідкують за памятью і її автоматично очищають після завершення, принайні так пишуть розробники

7

Re: Глобальна змінна

reverse2500 написав:

зараз багато сучасних мов програмування самі слідкують за памятью і її автоматично очищають після завершення, принайні так пишуть розробники

І як із цього випливає неможливість вистрелити собі в ногу?
До речі, після завершення пам'ять чистить не програма, а система - так що в C з цієї точки зору теж усе гаразд.
А що пам'ять чиститься під час виконання - так це тільки для звільнених змінних, а якщо їх не звільнювати, то пам'ять так само тече в будь-чому.

stack = []
while True:
    stack.append(stack[:])
Подякували: reverse2500, ReAl, leofun013

8 Востаннє редагувалося ReAl (28.08.2018 19:48:47)

Re: Глобальна змінна

reverse2500 написав:

С це таке зло, там і "самому собі ногу можна прострелити"

Ну загалом це трохи скорочена і змінена назва >двохсотсторінкової книжки Алена Голуба 1995 року з настановами по програмуванню в C/C++ (Allen Holub  "Enough Rope to Shoot Yourself in the Foot").
Тобто він писав про прийоми програмування, які зменшують шанси знайти мотузку достатньої довжини для того, щоб вистрілити собі в ногу, для С/С++, бо ці мови то основна його тематика.
Якщо порушувати ті рекомендації, то можна без проблем повіситися на пістолеті у якійсь іншій мові програмування (раніше, мабуть, ще до появи python і java, це звучало як «фортран-програму можна написати будь-якою мовою»).

Але чомусь всі вирішили, що С це саме та мова, якою стріляють собі в ногу…

9

Re: Глобальна змінна

Vitaliy_Danmer, як справи із завданням?

Там цікаво, якщо робити так, як у лекції голосом (вузол trie має bool прапорець для літери і масив вказівників на наступні літери), то по звіту valgrind виходять трохи не такі кількості виділень пам'яті і загальний обсяг, як у референсній програмі.
А якщо так, як на картинках у допоміжних поясненнях (у кожному вузлі масив bool для кожної літери і поруч масив вказівників на наступні, тобто це як наче підняти одиночні bool на рівень вище до вказівників на ці вузли, а якщо ні цієї літери не було, ні наступних нема, то цього вузла взагалі не буде), то 1:1 як у них.

10

Re: Глобальна змінна

reverse2500 написав:

зараз багато сучасних мов програмування самі слідкують за памятью і її автоматично очищають після завершення, принайні так пишуть розробники

Автоматична очистка памяті гарантує вам тільки те, що пам'ять яка була використана, буде очищена (іноді досить не очивидно для вас). Це вбереже вас від витоку памяті й тільки. Перш ніж балакати про вистріл в ногу, треба спочатку зрозуміти про що казав автор мема (та книги).

Подякували: ReAl, koala, leofun013

11

Re: Глобальна змінна

ReAl написав:

Vitaliy_Danmer, як справи із завданням?

Мене більше Python зараз цікавить, тому я вирішив, що 80%, які я маю для отримання сертифікату CS50, поки що досить:). Бо за той час, що я буду робити хеш таблиці у С, я зможу декілька курсів по Python пройти успішно:).

Наразі мова С у мене асоціюється з чимось лавкрафтіанським. Такий собі поклик C.thulhu :).
Загалом, треба більше досвіду з чимось більш простим.