The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Некоторые тонкости С/С++, !*! Мартовский заец, 18-Сен-03, 22:23  [смотреть все]
Здрасти!
Вопрос такой: есть две строки
wait_queue_t *my1=NULL:
static struct wait_queue_t *my2=NULL;

Вопрос: конкретно, чем отличаются типы созданных указателей?
И вдогону: в каких случаях требуется указывать ключевое слово <struct>
при объявлнии указателей на структуры?

Также:
try{
...
throw ("MAMA!");
...
}catch(const char *error){
...
}

Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT???
А для чего тада были писаны каманды try и catch...?

  • Некоторые тонкости С/С++, !*! bogerm, 05:16 , 19-Сен-03 (1)
    >Здрасти!
    >Вопрос такой: есть две строки
    >wait_queue_t *my1=NULL:

    Это стековый объект, значение my1 будет потеряно после выхода из области видимости данной переменной. Например при возврате из функции.

    >static struct wait_queue_t *my2=NULL;

    Переменная будет иметь старое значение после возврата в область видимости.
    Если же переменная объявлена как static внутри класса, то она становится общей для всех объектов этого класса.
    Вообще поведение переменной будет несколько различаться в зависимости от того, была ли она объявлена внутри функции, внутри класса или вне их.

    >
    >Вопрос: конкретно, чем отличаются типы созданных указателей?

    Типы указателей не отличаются. Просто переменные будут размещены в разных областях памяти.

    >И вдогону: в каких случаях требуется указывать ключевое слово <struct>
    >при объявлнии указателей на структуры?

    struct нужно всегда указывать в C и не нужно в C++. Но можно создать новый тип с помощью typedef и обойтись без ключевого слова struct при объявлении указателей.

    >
    >Также:
    >try{
    >...
    >throw ("MAMA!");
    >...
    >}catch(const char *error){
    >...
    >}
    >
    >Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT???
    >А для чего тада были писаны каманды try и catch...?

    Не понял... Вроде должно работать:

    > cat testcatch.cc
    #include <iostream.h>

    int main( void )
    {
       try {
            throw("Help!");
            exit(1);
       } catch(const char *error) {
            cout << "Received: " << error << endl;
       }
       cout << "Finished\n";
       return 0;
    }
    > g++ -o testcatch testcatch.cc
    > ./testcatch
    Received: Help!
    Finished

    • Некоторые тонкости С/С++, !*! Мартовский заец, 12:46 , 20-Сен-03 (2)
      >>Здрасти!
      >>Вопрос такой: есть две строки
      >>wait_queue_t *my1=NULL:
      >
      >Это стековый объект, значение my1 будет потеряно после выхода из области видимости
      >данной переменной. Например при возврате из функции.
      >
      >>static struct wait_queue_t *my2=NULL;
      >
      >Переменная будет иметь старое значение после возврата в область видимости.
      >Если же переменная объявлена как static внутри класса, то она становится общей
      >для всех объектов этого класса.
      >Вообще поведение переменной будет несколько различаться в зависимости от того, была ли
      >она объявлена внутри функции, внутри класса или вне их.
      >
      >>
      >>Вопрос: конкретно, чем отличаются типы созданных указателей?
      >
      >Типы указателей не отличаются. Просто переменные будут размещены в разных областях памяти.
      >
      >
      >>И вдогону: в каких случаях требуется указывать ключевое слово <struct>
      >>при объявлнии указателей на структуры?
      >
      >struct нужно всегда указывать в C и не нужно в C++. Но
      >можно создать новый тип с помощью typedef и обойтись без ключевого
      >слова struct при объявлении указателей.
      >

      Насчет статика и структа спасиба...
      Дело в том, что обе переменные были объявлены в модуле, в глоальной области.
      И при попытке засунуть my1 в процедуру sleep_on я получал предупреждение компилятора.

      sleep_on(my1);
      Warning: в процедуру передан указатель несовместимого типа!
      А почему???

      >>
      >>Также:
      >>try{
      >>...
      >>throw ("MAMA!");
      >>...
      >>}catch(const char *error){
      >>...
      >>}
      >>
      >>Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT???
      >>А для чего тада были писаны каманды try и catch...?
      >
      >Не понял... Вроде должно работать:
      >
      >> cat testcatch.cc
      >#include <iostream.h>
      >
      >int main( void )
      >{
      >   try {
      >        throw("Help!");
      >        exit(1);
      >   } catch(const char *error) {
      >        cout << "Received: "
      ><< error << endl;
      >   }
      >   cout << "Finished\n";
      >   return 0;
      >}
      >> g++ -o testcatch testcatch.cc
      >> ./testcatch
      >Received: Help!
      >Finished

      А вот тут странно:))) У меня в С++ программе не работает:)
      Лана, проверю еще раз...
      Вопрос вдогонку: почему в линухе С++ так мало применяется????
      Пытался найти примеры данной конструкции, а натыкался тока на чистый С++.
      Ладно ядро, но даже dosemulator и утилиты редхата - все на голом С!!!
      Он же в некоторых ситуациях приводит к пухлому коду!


      • Некоторые тонкости С/С++, !*! bug0r, 09:48 , 22-Сен-03 (3)
        >Вопрос вдогонку: почему в линухе С++ так мало применяется????
        >Пытался найти примеры данной конструкции, а натыкался тока на чистый С++.
        >Ладно ядро, но даже dosemulator и утилиты редхата - все на голом
        >С!!!
        >Он же в некоторых ситуациях приводит к пухлому коду!


        Наверно для совместимости.  :-)

      • Некоторые тонкости С/С++, !*! aka50, 16:44 , 23-Сен-03 (4)
        >>>Здрасти!
        >>>Вопрос такой: есть две строки
        >>>wait_queue_t *my1=NULL:
        >>
        >>Это стековый объект, значение my1 будет потеряно после выхода из области видимости
        >>данной переменной. Например при возврате из функции.
        >>
        >>>static struct wait_queue_t *my2=NULL;
        >>
        >>Переменная будет иметь старое значение после возврата в область видимости.
        >>Если же переменная объявлена как static внутри класса, то она становится общей
        >>для всех объектов этого класса.
        >>Вообще поведение переменной будет несколько различаться в зависимости от того, была ли
        >>она объявлена внутри функции, внутри класса или вне их.
        >>
        >>>
        >>>Вопрос: конкретно, чем отличаются типы созданных указателей?
        >>
        >>Типы указателей не отличаются. Просто переменные будут размещены в разных областях памяти.
        >>
        >>
        >>>И вдогону: в каких случаях требуется указывать ключевое слово <struct>
        >>>при объявлнии указателей на структуры?
        >>
        >>struct нужно всегда указывать в C и не нужно в C++. Но
        >>можно создать новый тип с помощью typedef и обойтись без ключевого
        >>слова struct при объявлении указателей.
        >>
        >
        >Насчет статика и структа спасиба...
        >Дело в том, что обе переменные были объявлены в модуле, в глоальной
        >области.
        >И при попытке засунуть my1 в процедуру sleep_on я получал предупреждение компилятора.
        >
        >
        >sleep_on(my1);
        >Warning: в процедуру передан указатель несовместимого типа!
        >А почему???

        надо смотреть как sleep_on() объявлена

        >
        >>>
        >>>Также:
        >>>try{
        >>>...
        >>>throw ("MAMA!");
        >>>...
        >>>}catch(const char *error){
        >>>...
        >>>}
        >>>
        >>>Вопрос: почему команда throw приводит к завершению программы по сигналу SIGABRT???
        >>>А для чего тада были писаны каманды try и catch...?
        >>
        >>Не понял... Вроде должно работать:
        >>
        >>> cat testcatch.cc
        >>#include <iostream.h>
        >>
        >>int main( void )
        >>{
        >>   try {
        >>        throw("Help!");
        >>        exit(1);
        >>   } catch(const char *error) {
        >>        cout << "Received: "
        >><< error << endl;
        >>   }
        >>   cout << "Finished\n";
        >>   return 0;
        >>}
        >>> g++ -o testcatch testcatch.cc
        >>> ./testcatch
        >>Received: Help!
        >>Finished
        >
        >А вот тут странно:))) У меня в С++ программе не работает:)
        >Лана, проверю еще раз...

        >Вопрос вдогонку: почему в линухе С++ так мало применяется????
        >Пытался найти примеры данной конструкции, а натыкался тока на чистый С++.
        >Ладно ядро, но даже dosemulator и утилиты редхата - все на голом
        >С!!!
        >Он же в некоторых ситуациях приводит к пухлому коду!

        1. На С пухлый код??? Может быть тексту и больше, но в бинаре обычно меньше получается...
        2. Так принятно, потому что C++ требовательный язык, а С почти минимален, плюс к тому легко можно использовать код как в кернеле так и в юзерспейсе, а С++ в кернель не засунешь (конечно можно, но придется все отключить типа throw-catch и проч).
        3. Исторически сложилось, что операционка пишется на С, так как бытует мнение, что С менее перегружен левым кодом, который генерит компилятор С++ (ну классы, перегруженные операторы, таблицы методов). Даже виндовз - и та на С написана. :) (я имею ввиду систему, а не MFC и прочую муть).


      • Некоторые тонкости С/С++, !*! Мартовский заец, 21:18 , 26-Сен-03 (5)

        > cat testcatch.cc
        >#include <iostream.h>
        >
        >int main( void )
        >{
        >   try {
        >        throw("Help!");
        >        exit(1);
        >   } catch(const char *error) {
        >        cout << "Received: "
        ><< error << endl;
        >   }
        >   cout << "Finished\n";
        >   return 0;
        >}

        Понял!!! Вся фенька в объявлении "const char *error" !!!
        Если писать const - то все ОкОб! а если без const - то SIGABR :)))
        Вопрос: почему????




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру