C: Function pointer forward declaration
38 отговора
0 прегледа
C: Function pointer forward declaration
Имам следната постановка:
В началото на .c файла имам статична таблица от типа Id : FunPtr.
Под нея са дефинирани самите функции, които са статични и няма предвиден за тях хедър.
typedef-ът на самия пойнтер е в някакъв хедър който се вижда.
Някой да се сеща културен начин (т.е. изключваме груби кастове и т.н.) да декларирам тия функции така че да се виждат при инициализацията на таблицата без да им пиша пълните прототипи? Т.е. искам да ползва тайпдефа по някакъв начин, че е по-малък на обем.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
В началото на .c файла имам статична таблица от типа Id : FunPtr.
Под нея са дефинирани самите функции, които са статични и няма предвиден за тях хедър.
typedef-ът на самия пойнтер е в някакъв хедър който се вижда.
Някой да се сеща културен начин (т.е. изключваме груби кастове и т.н.) да декларирам тия функции така че да се виждат при инициализацията на таблицата без да им пиша пълните прототипи? Т.е. искам да ползва тайпдефа по някакъв начин, че е по-малък на обем.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: C: Function pointer forward declaration
Най-културното, което се сещам е да напишеш макрос, който да генерира пълния прототип.
Ако държиш на енигматичността, може да го използваш в хедъра за да дефинираш типа на указателя.
Ако държиш на енигматичността, може да го използваш в хедъра за да дефинираш типа на указателя.
Re: C: Function pointer forward declaration
Тайпдефа няма как да ти помогне. С него най-много някой поинтер да дефинираш ама пак стигаме до проблема с инициализацията.
Не виждам какъв ти е проблема да декларираш функциите преди инициализацията.
Пък чак толкова ако те мързи ами инициализарай таблицата на края на файла.
Не виждам какъв ти е проблема да декларираш функциите преди инициализацията.
Пък чак толкова ако те мързи ами инициализарай таблицата на края на файла.
Re: C: Function pointer forward declaration
Бе до тоя извод и аз стигнах, просто се надявах да излезне некой с по-яки знания по C и да каже как се прави.
Проблемът ми е, че функциите имат космати прототипи на по 4 реда да кажем, аз предпочитам да са макс на 1. Ма тва не е съществено, де, просто като аз не знам нещо как да стане винаги се радвам ако намера неой дето знае как, ама по друг начин.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Проблемът ми е, че функциите имат космати прототипи на по 4 реда да кажем, аз предпочитам да са макс на 1. Ма тва не е съществено, де, просто като аз не знам нещо как да стане винаги се радвам ако намера неой дето знае как, ама по друг начин.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: C: Function pointer forward declaration
Подкрепям за макроса. Освен това има номер с един макрос да дефинираш два салама, ама е висша акробатика и не е за всеки.
Re: C: Function pointer forward declaration
Да не си се върнал да работиш в Джонсън ?
майтапя се
майтапя се
:-D
Не знам дали ще ти хареса
Значи преди таблицата заделяш един статичен масив от поинтери към функциите
На таблицата й задаваш съответния елемент от масива,
а след декларацията на всяка функция - добавяш функцията в масива
Dum loquo hora fugit
Значи преди таблицата заделяш един статичен масив от поинтери към функциите
На таблицата й задаваш съответния елемент от масива,
а след декларацията на всяка функция - добавяш функцията в масива
Dum loquo hora fugit
Re: C: Function pointer forward declaration
Ако таблицата е публична ги викай направо през нея бре младеж. Добър начин за всяване на смут, объркване, и респект сред останалите младежи в дружинката. ;)
0xCodeFace
0xCodeFace
Re: C: Function pointer forward declaration
Неее, пази Боже! На C++ пиша повечето време, ма се налага понякога да се барат и модули на C. А тва хич не ме кефи. Език без конструктор/деструктор, които се викат когато трябва, а не когато реши някой колектор не го признавам. Всъщност аз друг език освен C++ който има такова нещо не знам (не казвам, че няма, просто не знам). Толкова елементарно нещо, толкова важно и толкова липсващо.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: C: Function pointer forward declaration
е разни яви мисля че викат деструктора веднага, а паметта освобождават когато им кефне. впрочем не знам какво се кефят толкова на гарбидж колекторите, смарт поинтера върши същото, но е десет пъти по-предвидим.
NE SUTOR ULTRA CREPIDAM
NE SUTOR ULTRA CREPIDAM
Re: C: Function pointer forward declaration
И ти като всички като чуеш 'деструктор' и се сещаш за памет. Паметта е просто частен случай на ресурс. Идеята за симетрични действия във фиксиран интервал е много по-обща (и смарт пойнтерите са нейното проявление).
Конкретно джавата не знам да има деструктори, но C# има. Но за да се викнат когато трябва трябва да използваш доста неудобна езикова конструкция 'using' (дори не я знам как се ползва, но вече знам че я има). По стандартен начин преди да го знам това бях се сблъсквал с отворен от мен файл, който не се е затворил когато съм очаквал (при излизане от блока да му се викне деструктора да го затвори).
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Конкретно джавата не знам да има деструктори, но C# има. Но за да се викнат когато трябва трябва да използваш доста неудобна езикова конструкция 'using' (дори не я знам как се ползва, но вече знам че я има). По стандартен начин преди да го знам това бях се сблъсквал с отворен от мен файл, който не се е затворил когато съм очаквал (при излизане от блока да му се викне деструктора да го затвори).
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: C: Function pointer forward declaration
начи лошо. деструктора наистина е важно да се вика когато обекта спре да го има, пък паметта да се освобождава когато иска.
NE SUTOR ULTRA CREPIDAM
NE SUTOR ULTRA CREPIDAM
Re: C: Function pointer forward declaration
Мдам, C++ програмистите сме свикнали при излизане от блока да се оправят нещата. Но в другите ООП езици животът е доста по-сложен :) Въпреки че ако в деструкторите цъфне ексепшън, пак може да се омаже работата.
Чудя се тоя клас няма ли си метод от сорта на CloseFile(). Ще ми побелеят косите, ако се налага за всеки файл да чакам гарбич кълектора да го затваря :D Дори и да го викаш някъде този метод, викането му може да бъде възпрепятствано от цъфване на някой ексепшън и трябва да се подхожда по по-специален начин.
Явно затова чистите Си програмисти мразят ексепшъните :)
Чудя се тоя клас няма ли си метод от сорта на CloseFile(). Ще ми побелеят косите, ако се налага за всеки файл да чакам гарбич кълектора да го затваря :D Дори и да го викаш някъде този метод, викането му може да бъде възпрепятствано от цъфване на някой ексепшън и трябва да се подхожда по по-специален начин.
Явно затова чистите Си програмисти мразят ексепшъните :)
Редактирано от Wolfheart на
Re: C: Function pointer forward declaration
аз съм С++ и пак ги мразя. тоест мразя функционалното им използване - да пишеш код който разчита на тях, както някои обичат.
NE SUTOR ULTRA CREPIDAM
NE SUTOR ULTRA CREPIDAM
Re: C: Function pointer forward declaration
Има си close, ма хич не ги обичам тия работи. В края на краищата така го направих. По-късно ми казаха за 'using'. Големият проблем на ръчното викане на деструктващата функция е следният:
tryА
{
конструкт 1;
конструкт 2; -> изцепшън
}
catch
{
проверяваме конструкт 2 за null и ако не е викаме деструкт 2.
проверяваме конструкт 1 за null и ако не е викаме деструкт 1.
}
деструкт 2
деструкт 1
Е тва е фирата - дублиране на кода за деструкт и постоянни проверки кое е успяло да се констуктне и кое - не.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
tryА
{
конструкт 1;
конструкт 2; -> изцепшън
}
catch
{
проверяваме конструкт 2 за null и ако не е викаме деструкт 2.
проверяваме конструкт 1 за null и ако не е викаме деструкт 1.
}
деструкт 2
деструкт 1
Е тва е фирата - дублиране на кода за деструкт и постоянни проверки кое е успяло да се констуктне и кое - не.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: C: Function pointer forward declaration
Тия дето хвърлят ексепшъни в деструктор ще са първите изправени до стената като дойде революцията.
Re: C: Function pointer forward declaration
Ахъ, пробвай да направиш using на C# клас дето не имплементира IDisposable и пиши тука как се е засмял компилатора. Десктруктори естествено си има, ма немат общо с using.
Java има finalize.
Java има finalize.
Re: C: Function pointer forward declaration
Немам намерение да навлизам в тънкостите на #. Говоря, че класа за файл може да се ползва с using, щото е именно такъв и има деструктор.
Общото е, че деструкторът се вика навреме като се ползва using, а не когато се сети боклукчията.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Общото е, че деструкторът се вика навреме като се ползва using, а не когато се сети боклукчията.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: C: Function pointer forward declaration
Ми не навлизай, ма това което ти казвам е, че десктруктор в C# и имплементиране на IDisposable, което е нужно за using, са 2 абсолютно различни неща и using НЕ ВИКА десктруктора.
Re: C: Function pointer forward declaration
Ми доколкото си спомням в C# имаше два вида 'деструктори' и едното явно е тва което носи името 'дестуктор', а другото си има друго име. Не ме интересува конкретиката на езика и се надявам никога пак да не ми се наложи да пиша на него. Важното, че за да ми се извика дадена функция, както и да се нарича тя, при излизане от скоуп се ползва 'using'.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_