Отговори на тема  [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща
глобални променливи в С 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: глобални променливи в С
Всяка е глобална ако не е static. В друг файл може да кажеш extern променлива; и да си я ползваш.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Нед Дек 29, 2019 8:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: глобални променливи в С
Леле много се изписа.
Прочетох малко да static я прави видима или нещо като локална само за файла където се декларира. Реално са се получили 2 отделни променливи с еднакво име и затова не можело да я променям от другия .c файл

Да може би не е добра практика да ги инициализирам във header-a, освен ако не са константи някакви.
Има варианти да пиша extern по .c файловете, но е неудобно. Ако я напиша със extern във header-a пак не ще, ако я инициализирам дава същата грешка. Някъде четох че по подразбиране променливата била extern. Т.е. това е само декларация. Но ако и се зададе стойност става дефиниция дори и да има extern. Гледах и някакви гимнастики със #eleif писаници във header-а, ама много писане... На моите header-и съм сложил въпросните safe guard-ове. Но пак не може да се инициализират глобални променливи. Все пак реално като се замисля, да се зададе някаква стойност на променливата е изпълним код и принципно не е добре да се прави във header-а. Интересното беше, че това не е проблем във mplab-a XC8 там няма такива проблеми, и очаквах да е някаква настройка в GCC. :roll:

_________________
https://github.com/slav4ocom/


Нед Дек 29, 2019 8:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: глобални променливи в С
Е - тая инициализация на глобална променлива в хедър файл...като го включиш няколко пъти тоя хедър в няколко Ц файла....ще стане не спагети, ами боза. За мене е редно да не се компилира..
Стартъп кода ти ги нулира (ако е разрешен) , другото си е твоя грижа в началото на програмата - и по прегледно и по-безопасно. Броят на натиснатите клавиши ще е еднакъв.
C::B има много голям екран опции за компилатора(MinGW? ) - кое е грешка, кое не е....ама май по-добре да не се пипа там.


Нед Дек 29, 2019 9:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: глобални променливи в С
Ами да разбирам не е добре да се инициализира там. Но ако е константа къде да я инициализирам ? Със const пак дава такива грешки. Пробвам константата само да я декларирам в хедъра а във цето да и задам стойност (дефинирам) ама не става.
Имам тука един проект на XC8 в който съм написъл едни константи в хедъра и се ползват от целият проект. Всъщност са едни дълги стрингове от по 100 и повече символа. Единствения начин да не гърми GCC е да ги пиша константите във всеки .c файл, което е упражнение за луди. :|

_________________
https://github.com/slav4ocom/


Последна промяна slav4o.com на Нед Дек 29, 2019 9:56 pm, променена общо 1 път



Нед Дек 29, 2019 9:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: глобални променливи в С
Дай някакъв пример. Бобът е на свършване.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Нед Дек 29, 2019 9:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: глобални променливи в С
syscop написа:
Дай някакъв пример. Бобът е на свършване.

Ами примерно :
main.h :
Код:
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED

int testvar1 = 1;

#endif // MAIN_H_INCLUDED



main.c :
Код:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"
#include "main.h"


int main()
{
    testvar1 = 11;
    printf("Hello world!\n");
    printf("%d\n",testvar1);
    TestFunc();
    return 0;
}



lib.h :
Код:
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

//int testvar2 = 2;
const int testconst2 = 2;

void TestFunc(void);
#endif // LIB_H_INCLUDED



lib.c :
Код:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"

void TestFunc(void)
{

    printf("%d\n",testconst2);
}




Код:

-------------- Build: Release in recursion (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe  -o bin\Release\recursion.exe obj\Release\lib.o obj\Release\main.o  -s 
obj\Release\main.o:main.c:(.rdata+0x14): multiple definition of `testconst2'
obj\Release\lib.o:lib.c:(.rdata+0x4): first defined here
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))


_________________
https://github.com/slav4ocom/


Нед Дек 29, 2019 9:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 5:52 pm
Мнения: 10356
Местоположение: Добрич
Мнение Re: глобални променливи в С
lib.h :
Код:
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

// declaration 1:
extern const int testconst2;

// declaration 2:
void TestFunc(void);


#endif // LIB_H_INCLUDED



lib.c :
Код:
#include <stdio.h>
#include <stdlib.h>
#include "lib.h"

// definition 1:
const int testconst2 = 2;

// definition 2:
void TestFunc(void)
{

    printf("%d\n",testconst2);
}




Нед Дек 29, 2019 10:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: глобални променливи в С
Ами и константите могат да се декларират extern, a ако са някакви прости числа - може и с
#define MAXALABALA 120 .

Всъщност тук имаш #include "lib.h",
да не би тоя хедър да е добавен и като файл към проекта?


Нед Дек 29, 2019 10:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: глобални променливи в С
Миро, да така работи :) Оказва се че в хедъра може и без extern, явно са наистина по дефолт екстерн.
Стефан, да в графата Headers не е във Sources където са .c -тата

_________________
https://github.com/slav4ocom/


Нед Дек 29, 2019 10:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: глобални променливи в С
Сложи const int testconst2 = 2; в *.c файл. Направи съответен *.h файл със следното extern int testconst2;

По-горе писах: extern int testconst2; не заема памет - само казва на компилатора, че има такава променлива с даден тип.
const int testconst2 казва на компилатора да задели sizeof(int) байта памет. Ако това нещо го има на повече от едно място тогава, виждаш грешката, за която питаш - поне е кристално ясна - за всеки отделен *.c файл, в който добавиш твоя заглавен lib.h компилатора ще задели sizeof(int) байта, но линкера ще се чуди какво да ги прави понеже са с еднакви имена.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Нед Дек 29, 2019 10:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: глобални променливи в С
Мда така със extern си се получава. Във XC8 обаче ако не напиша в хедъра extern ми казва
Код:
lib.c:5:: warning: (1478) initial value for "_testconst2" differs to that in ./lib.h:17

От друга страна мога да изстрия да не пише нищо във lib.c
а константата да си я напиша във lib.h cosnt int testconst2 = 2; и да си я ползвам в целият проект, без изобщо да имам lib.c
Демек нещо като header само с константи :) Номера обаче не става в GCC
Това с #define не винаги ще върши работа, ако имам съобщение стринг с интервали няма как да го въведа...

_________________
https://github.com/slav4ocom/


Нед Дек 29, 2019 10:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 1:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: глобални променливи в С
slav4o.com написа:
Миро, да така работи :) ...

Ей... :) Евала, Аферим, Ашколсун... :D
Добре е да знаеш още, че XC8 е порт на GCC ;)

_________________
Най-опасният враг на истината и свободата е мнозинството.


Нед Дек 29, 2019 11:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: глобални променливи в С
Добре сега още един новобрански въпрос :)

Начи имам си #include <stdio.h>

и след това мога да си пиша
printf("Ala Bala");
// printf e функция от stdio.h

напраайвам си библиотека lib.c и тя си има lib.h
във lib.c си имам TestFunc();

във main.c си я инклудвам и нея #include lib.h
Опитвам се да извикам TestFunc(); но линкера дава грешка, ако не съм добавил в проекта lib.c Да разбираемо, донякъде. Хубаво ама защо не ме кара да добавям в проекта stdio.c и си ги намира функциите ? Как да го направя тоя чалъм и с моята библиотека ?

_________________
https://github.com/slav4ocom/


Пон Дек 30, 2019 12:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 10:22 pm
Мнения: 3074
Мнение Re: глобални променливи в С
Както Миро каза - нито риба, нито рак.
И без "extern" променливата реално само се декларира (и в двата Ц файла), накрая линкера я дефинира според декларацията и двата сорса работят с една и съща променлива.Поне така ми изглежда. Ако има инициализация и в двата файла - гърми. Това с C::B ,компилатор MinGW-g++ .
Оттук и защо гърми , ако е инициализирана в хедър, който се включва в няколко сорса.
XC8 е малко по-друга бира..."embedded" бира, та силно ми се струва, че конструкция
"const int XX=8;" се свежда по-скоро до "#define XX 8" и въобще не се заделя памет за XX.


Има си някакви прекомпилирани библиотеки, които реализират функциите , описани в stdio.h.
Линкера си ги търси сам. Твоето lib.c можеш да го компилираш до библиотека lib.a и после да посочиш на линкера да търси функции и в тази библиотека.


Пон Дек 30, 2019 12:56 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 7:04 pm
Мнения: 2581
Местоположение: Велико Търново / София
Мнение Re: глобални променливи в С
Сега ми дойде на ум, ако я прекомпилирам библиотеката, дали ще ми се намали цялото време на компилиране ?
Но ще са утре пробите, че стана късно...

_________________
https://github.com/slav4ocom/


Пон Дек 30, 2019 1:24 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни