• В чем различие void func(char * var) от void func(char **var)?

    dio4
    @dio4
    team leader, system engineer, master of sports
    Меньше слов - больше кода )))
    #include <stdio.h>
    char * arr_char = "I am a 1";
    typedef  char * type_p;
    /* создаем указатель на указатель */
    type_p * parr_char = &arr_char;
    
    int main( int argc, char * argv[]){ 
    // вывод строки через двойную **  
    	while( **parr_char != '\0' ) {
    		printf("%c", **parr_char);
    		(*parr_char)++;
    	}
    	printf("\n"); 
    // вывод строки через одинарную *  
    	arr_char = &"I am a 1"[0];  // возвращаем указатель на начало строки
    	//arr_char = "I am a 1";  // или так возвращаем указатель на начало строки
     //arr_char = arr_char - 8;  // или так на начальный размер strlen(arr_char)
    	while( *arr_char != '\0' ) {
    		printf("%c", *arr_char);
    		arr_char++;
    	}
    	printf("\n"); 
    	return 0;
    }
    /*
    Linux alexander-Inspiron-3521 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    имеем в консоли
    ./tmp_str
    I am a 1
    I am a 1
    
    */
    Ответ написан
    1 комментарий
  • В чем различие void func(char * var) от void func(char **var)?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Это плохо. Указатели - основа С, без понимания того, как работают указатели, будет ооочень трудно.

    char *var - указатель на переменную типа char. Сама var содержит адрес, шестнадцатеричное число, размер его зависит от реализации, от ОС, от платформы etc. Этот адрес указывает на область памяти длиной 1 байт (потому что char *), соответственно в эту область можно поместить 1 байт. Если поместить туда скажем переменную типа short int (два байта), то можно получить опять же в зависимости от того, как получали под нее память либо затирание соседней переменной (что не всегда плохо и очень часто используется для обнуления областей), либо SIGSEGV, то есть нарушение защиты памяти, запись в область памяти не выделенную программе.
    char ** var - указатель на указатель на переменную типа char. Сама var, как и раньше содержит адрес, но теперь этот адрес указывает на область памяти размером с указатель (он фиксированный в пределах реализации) и по этому адресу записан адрес области, в которую можно поместить 1 байт (со всеми вытекающими последствиями).
    Зачем такие извращения? Ну, например для упрощения вызова функции - передавать один параметр или же 4-5. Обработка списков, деревьев и всего, что строится на их основе. Данная конструкция очень распространена, рекомендую проработать пару демок в отладчике - с дотошным разбором, где что находится, как откуда и куда извлекается...
    Ответ написан
    3 комментария
  • В чем различие void func(char * var) от void func(char **var)?

    flygrounder
    @flygrounder
    Python/Django
    char* var - одномерный указатель типа char
    Его можно использовать так:
    1)
    char t='1';
    char* var=&t;
    *var = '2';

    2)
    Массив char var[10]; сам по себе является указателем, а потому его не надо разыменовывать и проч.
    3)
    char** var-двумерный указатель
    Использовать можно так:
    char** var= new char*[10]; 
    for(int i=0;i<10;i++){
        var[i] = new char[10]; 
    }
    Ответ написан
    Комментировать
  • Как добавлают несколько узлов в однонаправленных связных списках в си?

    "Собственно я не понимаю в чем динамизм списков, если при создании узла мне надо дать имя узлу"
    И что за имя?
    Суть в следующем.
    Для массива - тебе нужно заранее знать, сколько выделить памяти.
    Для списка же - ты можешь добавлять элементы на ходу (например - в цикле неизвестной заранее длительности).
    Условно:
    struct List {
      void* value;
      List* next;
    }
    
    List* newList(void* value) {
      List* result = malloc(sizeof(List), 1);
      result->value = value;
      result->next = NULL;
      return result;
    }
    
    void main() {
      char* rootValue = "ROOT";
      List* root = newList((void*)rootValue);
      List* list = root;
      while(true) {
        char* value = input();
        if (streq(value, "BREAK")) {
          break;
        }
        list->next = newList((void*) value);
        list = list->next;
      }
      list = root;
      while(list != NULL) {
        printf("%s", (char*)list->value);
        list = list->next;
      }
    }
    Ответ написан
    Комментировать
  • Как сменить корневую директорию apache в cloud9.io?

    nano /etc/apache2/sites-enabled/your-site
    находишь строчку DocumenRroot
    меняешь
    ctrl+x
    y
    enter
    service apache2 restart
    Ответ написан
    Комментировать
  • Почему в строке 35 структура объявлена таким образом?

    @res2001
    Developer, ex-admin
    Если вы про это строку:
    struct rusage before, after;
    То это не объявление структуры, а создание двух переменных типа struct rusage, а сама структура объявлена в одном из подключаемых заголовочных файлах.
    Ответ написан
    Комментировать
  • Почему в строке 35 структура объявлена таким образом?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Структура rusage определена в resource.h
    Ответ написан
    Комментировать
  • Как открыть ноутбук не сорвав защелки?

    x67
    @x67
    Или ноуты у вас неправильные или пластиковые карты толщиной 2 см. Разбирал много ноутов, но таких проблем почти нигде нет.
    Корпус как правило состоит из верхней и нижней половины. Убедитесь, что сняли клавиатуру, открутили все что может помешать, демонтировали дисковод. После того, старайтесь пальцами через любые технологические отверстия немного выгнуть одну из частей корпуса так, что бы защелки не нужно было отщелкивать. Иногда это лучше делать наоборот во внутрь, как бы скручивая корпус. Другую половинку в нужном месте можно немного отгибать. Если пользуетесь картой, не надо пытаться вставить ее сильно глубоко. После того, как справились с первыми несколькими защелками, не спеша, чуть отгиная корпус пытайтесь вытащить остальные (примерно как с петельками на лифчике). Тут главное - не спешить, ибо на этом этапе только спешка может привести к поломке.
    А вообще производители часто рассчитывают, что вы просто выкинете ноутбук после того как появится малейший повод вскрыть его, взамен купив новый, соответственно вы должны быть рады, что это всего лишь защелки, а не какие-нибудь заклепки.
    Ответ написан
    Комментировать
  • Как написать алгоритм для двоичного поиска по массиву с числами на си?

    Введите две переменные - начало и конец текущей области поиска и временно забудьте об оставшихся отрезках массива вне этой области.
    Ответ написан
    Комментировать
  • Как написать алгоритм для двоичного поиска по массиву с числами на си?

    @MiiNiPaa
    Что значит верные? Вам нужен индекс посередине новой области поиска? начало + (конец - начало)/2, примитивная математика.
    Ответ написан
    Комментировать
  • Почему код выполняется с ошибкой?

    @RapperOfGods
    функция scanf работает с указателями, так что в качестве параметра тебе нужно было передавать не "а", а адрес указывающий на "а", проще говоря напиши: scanf("%s", &a)
    Ответ написан
    6 комментариев
  • Как преобразовать строку в строку из кодов ASC II?

    fornit1917
    @fornit1917
    В сторону модуля strconv

    package main
    
    import (
        "fmt"
        "strconv"
    )
    
    func main() {
        var new_word string = ""
        word: = "something"
        for _, val: = range word {
            new_word += strconv.Itoa(int(val))
        }
        fmt.Println(new_word)
    }
    Ответ написан
    Комментировать
  • Почему файл не копируется?

    os.Mkdir(dst_path,1)
    Этой строчкой вы создаете папку по пути C:\test_file\file.arj
    Потом пытаетесь по этому же пути писать файл, поэтому и не получается.
    Вам нужно создавать папку C:\test_file, а не C:\test_file\file.arj.

    P.S. Лайфхак: если использовать нужные кавычки, то вам не придется дублировать \\.
    src_path := `C:\file.arj`
    dst_path := `C:\test_file\file.arj`
    Ответ написан
  • Можно ли произвести восстановление windows 7 home basic диском windows 7 Ultimate?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Да. можно.
    Главное чтобы разрядность совпадала.
    Загружаетесь с установочного диска, доходите до окна установка windows, и там выбираете - восстановление системы.
    Ответ написан
    Комментировать
  • Как установить модуль в python 3?

    s0ci0pat
    @s0ci0pat
    I'm Awesome
    Если нужен именно модуль patoolib для своего скрипта, то просто скачайте архив patool-1.9.tar.gz.
    Потом откройте его архиватором (7zip замечательно справляется)
    Достаньте каталог patoolib и поместите его в каталог, откуда запускаете свой скрипт.
    Ответ написан
    Комментировать
  • Как установить модуль в python 3?

    @Andy_U
    Пользуйтесь утилитой pip. Она вполне себе умеет "просачиваться" через прокси, даже с аутентификацией. Или вот, только что проверил - Pycharm без проблем ее (ваш patool) скачал и установил.

    P.S. Что у вас за прокси?
    Ответ написан
    7 комментариев
  • Как узнать, где начало жесткого диска?

    Nerwin
    @Nerwin
    И ни капельки я не тупой...просто ленивый
    он, как и полагается, размечает по порядку, начиная с 0 сектора (с самого края) идут: загрузчик, таблица разделов, и сами разделы.
    Ответ написан
    Комментировать
  • PyQt - с чего начать изучение?

    @dimas
    Необязательно искать уроки/примеры именно по PyQt, можно взять что найдется просто по Qt. По крайней мере имея опыт работы с Qt3 несколько лет назад, я смакетировал нужный мне скрин на PyQt за вечер ...

    Но без самомотивации ничего конечно не получится. Надо найти/придумать нужное себе приложение ...
    Ответ написан
    Комментировать
  • Почему не работает os.path.isdir?

    @zedxxx
    Python - how to find files and skip directories in...
    basepath = '/path/to/directory'
    for fname in os.listdir(basepath):
        path = os.path.join(basepath, fname)
        if os.path.isdir(path):
            # skip directories
            continue
    Ответ написан
    Комментировать
  • Почему не работает os.path.isdir?

    @vilgeforce
    Раздолбай и программист
    Аргумент для isdir пишите в промежуточную переменную и выводите ее вместе с результатов isdir. Может вы делаете совсем не то, что ожидаете.
    Ответ написан
    5 комментариев