• Как работает while ( !feof ( cfPtr ) )?

    Qubc
    @Qubc Автор вопроса
    Roman, спасибо, читал. The file position indicator for the stream is advanced by the number of characters read. И вот получается что индикатор увеличивается, но как-то непонятно как.
  • Почему pow возвращает разные значения от одинаковых float значений?

    Qubc
    @Qubc Автор вопроса
    res2001, Antony, Mercury13, спасибо, я понял, пока рановато, вернусь позже.
  • Почему pow возвращает разные значения от одинаковых float значений?

    Qubc
    @Qubc Автор вопроса
    res2001,
    только в первом вариант ваши floatы сначала преобразуются в double, а затем вызывается функция с double.
    , ну а во втором варианте такие же float сначала преобразуются в double, а затем вызывается функция с double.
    Разве нет?
  • Зачем определению(definition) объявлять(to declares), если есть определение(definition), которое определяет(to defines)?

    Qubc
    @Qubc Автор вопроса
    C The Complete Reference 4th Ed Herbert Schildt proglib

    extern
    Before examining extern, a brief description of C linkage is in order. C defines three categories of
    linkage: external, internal, and none. In general, functions and global variables have external
    linkage. This means they are available to all files that constitute a program. File scope objects
    declared as static (described in the next section) have internal linkage. These are known only within
    the file in which they are declared. Local variables have no linkage and are therefore known only
    within their own block.
    The principal use of extern is to specify that an object is declared with external linkage elsewhere in
    the program. To understand why this is important, it is necessary to understand the difference
    between a declaration and a definition. A declaration declares the name and type of an object. A
    definition causes storage to be allocated for the object. The same object may have many
    declarations, but there can be only one definition.
    In most cases, variable declarations are also definitions. However, by preceding a variable name
    with the extern specifier, you can declare a variable without defining it. Thus, when you need to
    refer to a variable that is defined in another part of your program, you can declare that variable using
    extern.

    Но я все равно пока что не понимаю) Вернусь позже.
    Хотя и понимаю, что ассемблер внутри функции должен заменять всякие метки func: и вызовы call funс с кодов абсолютной адресации на коды относительной адресации. Например, в виде "текущеее значениe PC + смещение", чтобы в стек заносилось правильный адрес переходов внутри функции. И все это для того, чтобы сделать функцию, которую нужно один раз скомпилировать, которую будут использовать другие программы, которую можно вставлять куда угодно.
  • Какой смысл несет слово "имитация" в словосочетании "имитация передачи аргументов по ссылке"?

    Qubc
    @Qubc Автор вопроса
    Раз: https://www.youtube.com/watch?v=hZOX-LlUETE
    Два: разные абзацы из Дейтлов.
    spoiler

    5.9 Passing Arguments By Value and By Reference
    In many programming languages, there are two ways to pass arguments—pass-by-value and pass-by-reference. When arguments are passed by value, a copy of the argument’s value is made and passed to the called function. Changes to the copy do not affect an original variable’s value in the caller. When an argument is passed by reference, the caller allows the called function to modify the original variable’s value.
    Pass-by-value should be used whenever the called function does not need to modify the value of the caller’s original variable. This prevents the accidental side effects (variable modifications) that so greatly hinder the development of correct and reliable software systems. Pass-by-reference should be used only with trusted called functions that need to modify the original variable.
    In C, all arguments are passed by value. As we’ll see in Chapter 7, it’s possible to simulate pass-by-reference by using the address operator and the indirection operator. In Chapter 6, we’ll see that array arguments are automatically passed by reference for performance reasons. We’ll see in Chapter 7 that this is not a contradiction. For now, we concentrate on pass-by-value.

    6.5 Passing Arrays to Functions
    Recall that all arguments in C are passed by value. C automatically passes arrays to functions by reference (again, we’ll see in Chapter 7 that this is not a contradiction)—the called functions can modify the element values in the callers’ original arrays. The name of the array evaluates to the address of the first element of the array. Because the starting address of the array is passed, the called function knows precisely where the array is stored. Therefore, when the called function modifies array elements in its function body, it’s odifying the actual elements of the array in their original memory locations. Причем, в параметрах функции будет объявлен указатель (либо массив, который будет преобразован в указатель) и под него будет зарезервирована память.

    7.1 Introduction
    In this chapter, we discuss one of the most powerful features of the C programming language, the pointer. Pointers are among C’s most difficult capabilities to master. Pointers enable programs to simulate pass-by-reference, to pass functions between functions, and to create and manipulate dynamic data structures, i.e., data structures that can grow and shrink at execution time, such as linked lists, queues, stacks and trees. This chapter explains basic pointer concepts. Chapter 10 examines the use of pointers with structures. Chapter 12 introduces dynamic memory management techniques and presents examples of creating and using dynamic data structures.

    7.2 Pointer Variable Definitions and Initialization
    Pointers are variables whose values are memory addresses. Normally, a variable directly contains a specific value. A pointer, on the other hand, contains an address of a variable that contains a specific value. In this sense, a variable name directly references a value, and a pointer indirectly references a value (Fig. 7.1). Referencing a value through a pointer is called indirection.

    7.4 Passing Arguments to Functions by Reference
    There are two ways to pass arguments to a function—pass-by-value and pass-by-reference. All arguments in C are passed by value. As we saw in Chapter 5, return may be used to return one value from a called function to a caller (or to return control from a called function without passing back a value). Many functions require the capability to modify variables in the caller or to pass a pointer to a large data object to avoid the overhead of passing the object by value (which incurs the time and memory overheads of making a copy of the object).
    In C, you use pointers and the indirection operator to simulate pass-by-reference. When calling a function with arguments that should be modified, the addresses of the arguments are passed. This is normally accomplished by applying the address operator (&) to the variable (in the caller) whose value will be modified. As we saw in Chapter 6, arrays are not passed using operator & because C automatically passes the starting location in memory of the array (the name of an array is equivalent to &arrayName[0]). When the address of a variable is passed to a function, the indirection operator (*) may be used in the function to modify the value at that location in the caller’s memory.


    Три: Получается, на этапе изучения С не очень правильно говорить "передача по ссылке", при том что нет ничего трудного в 10 строчках кода, демонстрирующих адреса указателей, объявленных в main и в какой-нибудь функции. Потому что читается так, будто при by value есть "копирование", а при взятии адреса и передаче его в указатель из параметров функции - нет. Хотя достаточно взглянуть например на .obj код и смысл станет понятен. Не нужно было зацикливаться на этих словах "имитация", без демонстрации ссылок из С++ это бессмысленно))) Зачем нужно было писать pass-by-reference вообще непонятно... Это действительно симуляция-имитация.

    #include <stdio.h>
    void byValue ( int a );
    void byPointer ( int * b );
    void byValueAgain ( int c );
    //void byRef( int &d );// в С нет.
    int main( void ) {
    	int x = 3;// будет зарезервирована память размером int под значение 3 под именем x.
    	int * xPtr;
    	printf ("%p\n", &x);//0028FF3C
    	printf ("%p\n", &xPtr);//0028FF38
    	byValue ( x );//0028FF20
    	byPointer ( &x );//0028FF20
    	byValueAgain ( x );//0028FF20
    //beRef( x );// в С нет. Но было бы тоже 0028FF20
    }
    //Написать параметр функции тоже самое, что определить переменную в main.
    void byValue ( int a ){ // будет зарезервирована память размером int под значение x под именем a (тип данных int). Произойдет копирование x.
    	printf ("%p\n", &a);
    	a = a * 2;
    }
    void byPointer ( int * b ){// будет зарезервирована память размером длины адреса в системе под значение адреса x под именем b (тип данных int *). Произойдет копирование адреса x.
    	printf ("%p\n", &b );
    	*b = *b * 2;// с помощью оператора * будет выполнен доступ по адресу к x и его непосредственное изменению.
    }
    void byValueAgain ( int c ){
    	printf ("%p\n", &c );
    }
    //void byRef ( int &d ){// будет зарезервирована память размером длины адреса в системе под значение адреса x под именем d (тип данных int &).
    //	printf ("%p\n", &d);
    // 	d = d * 2;
    //}


    То есть ссылка - это просто эволюция указателя по направлению высокоуровневости языка. Она решает те же задачи, что и указатель, только без нужды запариваться с операторами adress operator и dereferencing operator. Не нужно разыменовывать ссылку, она и так работает как будто обычная переменная. Но и арифметика указателей с сылкой работать, понятно, уже не будет.
  • Зачем определению(definition) объявлять(to declares), если есть определение(definition), которое определяет(to defines)?

    Qubc
    @Qubc Автор вопроса
    То есть ответ на вопрос требует хорошего понимания линковки, хорошо, что спросил, спасибо вам.
  • Сколько ячеек памяти будет занято при инициализации указателя адресом литерала?

    Qubc
    @Qubc Автор вопроса
    #include <stdio.h>
    	int main( void )
    	{
    		printf("%s\n", "Memory   Value    Symbol" );
    		char string3[] = "Good Bye";// имя массива можно использовать как указатель, но оно им не является.
    		char * string4 = "Hello";
    		printf("%p %p \n", &string4, string4 );
    		printf("%p %p \n", string4+0, *(string4+0) );// равнозначно &string4[0], string4[0]
    		for (int i = 0;  *(string4+i) != '\0'; ++i)
    		{
    			printf("%p %p %c\n", (string4+i), *(string4+i), string4[i] );// 2 нотации для примера.
    		}
    		puts("");
    		//&string3 нежелательно и только для примера, так может только printf; нужно string3 или &string3[0] .
    		printf("%p %p \n", &string3, string3 );  
    		printf("%p %p \n", string3+0, *(string3+0) );// равнозначно &string3[0], string3[0] 
    		for (int i = 0;  *(string3+i) != '\0'; ++i)
    		{
    			printf("%p %p %c\n", (string3+i), *(string3+i), string3[i] );// 2 нотации для примера.
    		}
    	
    	}
    	
    	Memory   Value    Symbol
    	0028FEEC 0040B07D
    	0040B07D 00000048
    	0040B07D 00000048 H
    	0040B07E 00000065 e
    	0040B07F 0000006C l
    	0040B080 0000006C l
    	0040B081 0000006F o
    
    	0028FEF3 0028FEF3
    	0028FEF3 00000047
    	0028FEF3 00000047 G
    	0028FEF4 0000006F o
    	0028FEF5 0000006F o
    	0028FEF6 00000064 d
    	0028FEF7 00000020
    	0028FEF8 00000042 B
    	0028FEF9 00000079 y
    	0028FEFA 00000065 e
  • Как изменить строку, инициализированную при объявлении массива символьных указателей, с помощью scanf?

    Qubc
    @Qubc Автор вопроса
    jcmvbkbc, ну конечно, да и можно было же адреса посмотреть
    const char * suit [4] = { "Hearts", "Diamonds", "Clubs", "Spades" };	
    printf ("%p\n", suit[0]);//разные
    suit [0] = "LOL";
    printf ("%p\n", suit[0]);

    Спасибо!
  • Как изменить строку, инициализированную при объявлении массива символьных указателей, с помощью scanf?

    Qubc
    @Qubc Автор вопроса
    Почему, несмотря на const, нет ошибки? Ведь должно быть запрещено менять эти строки.
    const char * suit [4] = { "Hearts", "Diamonds", "Clubs", "Spades" };	
    	suit [0] = "LOL";
  • Передача массива в функцию?

    Qubc
    @Qubc Автор вопроса
    Будет ошибкой только с точки зрения соответствия типов, потому что тип выражения &MAS -- int (*)[5]. Значение же адреса будет одним и тем же.

    Все же не понял...
    & - оператор взятия адреса. MAS при компиляции превратится в адрес.
    MAS == &MAS[0] , но MAS != &MAS. Почему?
  • Как вывести адрес ячейки массива?

    Qubc
    @Qubc Автор вопроса
    Я специально хотел %d, а %p. Понятно, что %d c float вызовет ошибку. Удивление вызывало то, что ломаются оба спецификатора в функции.
    Ожидал увидеть
    0_____2686768
    2686768
  • Передача массива в функцию?

    Qubc
    @Qubc Автор вопроса
    спасибо, я так и думал, что пока не дошел
  • Как скачать все видео с канала youtube?

    Qubc
    @Qubc
    InsiderZX ну, то есть 22 это уже готовый контейнер со своим видеокодеком и аудиокодеком. А чисто видео или аудио уже могут быть доступны с иными кодеками... Спасибо.

    Может сможете подсказать почему такой запрос выбирает более тяжелый файл? Он только по битрейту сравнивает, что ли? А можно как-то наименьший hd выбрать?
    youtube-dl -f "worstvideo[height=720]+worstaudio" https://www.youtube.com/watch?v=4vqRWYugy2s

    А доступны такие форматы:
    247 webm 1280x720 720p 1486k , vp9, 25fps, video only, 327.66MiB
    136 mp4 1280x720 720p 1498k , avc1.4d401f, 25fps, video only, 213.88MiB

    Понятно, только как-то так (символы конца строки удалить обязательно и тоже иногда пропускает тяжелее размер):
    youtube-dl -F https://www.youtube.com/watch?v=4vqRWYugy2s
    youtube-dl -f "
    worstvideo[height=720][filesize<200M]+worstaudio/
    worstvideo[height=720][filesize<250M]+worstaudio/
    worstvideo[height=720][filesize<300M]+worstaudio/
    worstvideo[height=720][filesize<350M]+worstaudio/
    worstvideo[height=720][filesize<400M]+worstaudio/
    worstvideo[height=720][filesize<450M]+worstaudio/
    worstvideo[height=720][filesize<500M]+worstaudio/
    worstvideo[height=720][filesize<550M]+worstaudio/
    worstvideo[height=720][filesize<600M]+worstaudio/
    worstvideo[height=720][filesize<650M]+worstaudio/
    worstvideo[height=720]+worstaudio
    " https://www.youtube.com/watch?v=yZbWFMURfB8
  • Как скачать все видео с канала youtube?

    Qubc
    @Qubc
    InsiderZX,
    А какая разница между 22 (272мб), 22+249(248мб) и 136+249(248мб) ?
    249          webm       audio only DASH audio   60k , opus @ 50k, 15.31MiB
    250          webm       audio only DASH audio   75k , opus @ 70k, 18.50MiB
    171          webm       audio only DASH audio  101k , vorbis@128k, 28.17MiB
    140          m4a        audio only DASH audio  131k , m4a_dash container, mp4a.40.2@128k, 39.23MiB
    251          webm       audio only DASH audio  150k , opus @160k, 35.69MiB
    160          mp4        256x144    144p   69k , avc1.4d400c, 25fps, video only, 10.11MiB
    278          webm       256x144    144p   96k , webm container, vp9, 25fps, video only, 23.69MiB
    242          webm       426x240    240p  147k , vp9, 25fps, video only, 27.68MiB
    133          mp4        426x240    240p  159k , avc1.4d4015, 25fps, video only, 22.17MiB
    134          mp4        640x360    360p  245k , avc1.4d401e, 25fps, video only, 34.34MiB
    243          webm       640x360    360p  306k , vp9, 25fps, video only, 60.22MiB
    135          mp4        854x480    480p  526k , avc1.4d401e, 25fps, video only, 80.01MiB
    244          webm       854x480    480p  605k , vp9, 25fps, video only, 124.94MiB
    136          mp4        1280x720   720p 1282k , avc1.4d401f, 25fps, video only, 233.52MiB
    247          webm       1280x720   720p 1510k , vp9, 25fps, video only, 397.51MiB
    298          mp4        1280x720   720p50 2240k , avc1.4d4020, 50fps, video only, 588.94MiB
    302          webm       1280x720   720p50 2670k , vp9, 50fps, video only, 787.49MiB
    17           3gp        176x144    small , mp4v.20.3, mp4a.40.2@ 24k, 21.31MiB
    36           3gp        320x180    small , mp4v.20.3, mp4a.40.2, 67.35MiB
    18           mp4        640x360    medium , avc1.42001E, mp4a.40.2@ 96k, 111.44MiB
    43           webm       640x360    medium , vp8.0, vorbis@128k, 185.11MiB
    22           mp4        1280x720   hd720 , avc1.64001F, mp4a.40.2@192k (best)
  • Что есть структура, а что оператор в C?

    Qubc
    @Qubc Автор вопроса
    У меня нет оригинала.
    Не могли бы написать, как там написано в главе 2.2 после хорошего стиля программирования 2.1:
    "Вся строка, включая printf, называется оператором " ?

    2019. Так найди его, тупень!
    Просто нужно было взять английские версии и смотреть параллельно в них.

    Code The Hidden Language of Computer Hardware and Software Charles Petzold
    C How to program seventh edition 2014
    C The Complete Reference 4th Ed Herbert Schildt proglib

    Нет никаких проблем ни со statement, ни с "if statement", ни с operators, ни с expressions, ни с "if statement, while statement" и так далее.
    Кто придумал "инструкцию" переводить как "оператор"? Кто придумал "оператор сложения" переводить как "операция сложения"? Зачем вообще говорить "операция сложения", когда можно сказать "сложение"?
    Зачем line переводить как строку? Почему нельзя перевести "structere programming" как "структурированное программирование"? Почему нельзя просто сказать, что "массив - это структурированные данных" или "структура - это структурированные данные" ? C Is a Structured Language! For example, structured languages typically support several loop constructs, such as while, do-while, and for.

    1hello.ru/grammatika/otglagolnye-sushhestvitelnye-...
  • Что есть структура, а что оператор в C?

    Qubc
    @Qubc Автор вопроса
    Roman, вот "инструкция" как-то ближе и роднее звучит.
  • Можно ли запустить jar с пустым manifest.mf?

    Qubc
    @Qubc Автор вопроса
    Сергей Горностаев, Data.class дал такое:
    C:\>java -cp C:\model.jar folder1.folder2.model.Data
    Error: Main method not found in class folder1.folder2.model.Data, please define the main method
    public static void main(String[] args)
    or a JavaFX application class must extend javafx.application.Application

    Все остальные Error: Could not find or load main class

    Может ещё что-то нужно? Или .jar самостоятелен?