I’ve been trying to learn my way through the winapi in C, and I’m trying to use the VirtualAlloc()
function to allocate memory. The function clearly takes 4 arguments and I’m supplying 4 arguments as per the windows API documentation.
Function body:
VirtualAlloc(
lpAddress,
dwSize,
flAllocationType,
flProtect
);
How I’m supplying the function:
//values I inserted here have the correct types, again the problem is that it complains about few arguments
void* memory = VirtualAlloc(
NULL,
DRAWING_AREA_MEMORY_SIZE,
MEM_RESERVE | MEM_COMMIT,
PAGE_READWRITE
);
I tried using only one allocation type instead of piping, just in case that caused the problem for some reason, but to no avail
Error Copied from the compiler:
Error (active) E0165 too few arguments in function call
I can’t tell what could be the problem. Funny enough, no matter how many other arguments I throw in, it stays too few and never changes to too many. What is going on here?
2 oшибкe в строке 29 :1)Ошибка — E016 слишком мало аргументов в вызове функции 2)Ошибка — C2660 k: функция не принимает 1 аргумент
#include <cmath>
#include <iostream>
using namespace std;
double k(double, double);
double k1(double, double);
void main()
{
double p, q, h, j, k;
cout << "p=";
cin >> p;
cout << "q=";
cin >> q;
cout << "Вiдповідь:" << k1(p, q);
}
double k(double x, double y)
{
double f = sin(x) / y * y + cos(y) / x * x;
return f;
}
double k1(double p, double q)
{
double d = ((pow(k(1.0 + p), pow(q, 2))), 2) - k(q * p, 1) / (1 + k(pow(p, 2), q));
return d;
}
В предыдущем сообщении ошибка, все работает, я ошибся в выводе типа данных — printf(«%cn», filek), надо было printf(«%sn», filek).
Строго не судите, но подскажите пожалуйста по такому вопросу, ни как не могу сообразить:
Если я правильно понял, то:
1)Конструкция FILE *»имя переменной» — это объявление переменной в виде того, что она будет указателем, на одномерный массив символов считанных из файла.
2)Соответственно само присвоение этой переменной значение через функцию fopen — это и есть сам указатель на этот массив.
3)Соответственно, если в функции getc указать название этого указателя на массив, то функция getc возвращает первый элемент этого массива в виде одного символа.
И вот в связи с этим два вопроса:
1)Подскажите, как получить из функции getc и второй элемент массива и третий и вообще все ? Я гуглиг, перегуглил, были примеры, но я так я не понял, как заставить getc возвратить n-ый элемент массива, а не только первый.
2)И можно ли как то определить размер этого массива(именно по кол-во элементов, а не то сколько он занимает место в памяти), который расположен по указателю fopen ?
Как добавить с++ программу в автозагрузку?
Как реализовать автозагрузку на с++?
-
Вопрос заданболее трёх лет назад
-
650 просмотров
Пригласить эксперта
Записать путь к экзешнику вашей программы в реестр, ветку HKCU/Microsoft/Windows/Current Version/Run (вместо HKCU можно использовать HKLM, если вы под админом и хотите установить автозагрузку для всех юзеров компа).
-
Показать ещё
Загружается…
13 июн. 2023, в 18:22
180000 руб./за проект
13 июн. 2023, в 18:21
2000 руб./в час
13 июн. 2023, в 18:12
1000 руб./за проект
Минуточку внимания
Некоторые мысли, прежде чем мы начнем
(Эта преамбула — мое мнение).
Хотя более старые стандарты C
позволяют использовать тип int
по умолчанию в ситуациях, когда вы явно не объявляете тип (например, возвращаемые значения функций, параметры для функции и т.д.), Мы всегда хотим избежать этой практики, поскольку это может привести к неверные предположения компилятора языка Си о характере переменной и, таким образом, приводят к неожиданным результатам. В то время как C, вероятно, самый мощный из всех языков, он также очень неумолимый, и вы должны рассказать ему все, что вы хотите для него делать. Предполагается, что вы знаете, что делаете. Таким образом, лучший способ избежать ошибок — быть явным и создавать небольшие значимые фрагменты кода и соткать их вместе.
Фактический ответ
Подумайте о том, как вы хотите продолжить.
Сначала позвольте разделить проблему на две простые проблемы:
Мы хотим получить соответствующие письма для данного класса.
Нам нужно выяснить взвешенную окончательную оценку для каждого человека, учитывая их оценки по каждой категории.
Side Note: Здесь вы хотите подумать о создании (или не хотите создавать функцию): Обратите внимание, что я предложил создать функции для конкретных «изменений», но я специально избегал функции делать процедурные вещи (например, печатать вещи из.)
ШАГ 1 — Общая структура
Сначала создайте нашу общую программу, у которой есть структура, которую мы хотим с пустыми функциями (они не делают ничего полезного, но мы ожидаем, что это будет сделано дальше)
#include <stdio.h>
int calc_final_grade(
int attendance,
int assignments,
int programs,
int quizzes,
int exam);const char *grade_to_letters(int grade);
int main()
{printf("Name: %s, Grade: %sn", "Tom, Adams",
grade_to_letters(calc_final_grade(95, 93, 95, 99, 94)));return 0; /* successfully finished */
}int calc_final_grade(
int attendance,
int assignments,
int programs,
int quizzes,
int exam)
{
/* TODO calculate something */
return 100; /* just return a value for now */
}const char *grade_to_letters(int grade)
{
const char result[] = "A+";/* TODO: actually do the conversion of grade to letters */
/* FIXME: trouble with 'return result' is we are returning a
* memory address value (where "A+" is stored, but it local to
* this function) so by the time our main function tries to
* _read_ the value at this memory address to print it,
* the function context has been lost and its
* contents would've disappeared from under us */return result;
}
Вышеприведенная программа достаточно хороша для того, чтобы мы могли строить вещи, за исключением того, что исправляем проблему с памятью в class_to_letters.
Нам нужно место для сохранения оценки, но поскольку мы хотим сохранить строку (не базовый тип C), мы не можем просто вернуть ее по значению, мы должны ее где-то сохранить и вернуть адрес того, где мы ее сохранили. Кроме того, место, где мы храним его, должно быть действительным в контексте или области той части программы, которая пытается ее использовать.
Поэтому мы создаем место для письма класса, в котором мы работаем в рамках функции, в которой мы хотим ее использовать (в нашем случае мы grade_to_letters
ее в main
) и передаем адрес этого места вместе с функцией grade_to_letters
чтобы фактически использовать как хранение его результата.
Это означает, что first grade_to_letters
должен принимать адрес материала магазина — пусть это произойдет:
Таким образом, мы меняем определение grade_to_letters
чтобы принять местоположение для результатов, в нашем случае мы хотим, чтобы этого было достаточно для трех символов (буквы, модификатора и символа окончания строки ):
const char *grade_to_letters(
char result[3], /* a place to store the results */
...); /* see below */
Обратите внимание, что теперь нам не нужно объявлять локальную переменную для результата, у нас уже есть пятно (хотя обратите внимание, что мы все равно можем вернуть результат!);
Мы также можем заметить, что наши оценки никогда не могут быть отрицательными, поэтому мы делаем их целыми без знака. Итак, наш прототип становится:
const char *grade_to_letters(char result[3], unsigned int grade)
Шаг 2 — Внедрение grade_to_letters
Теперь мы можем пойти и создать простой класс_to_letters:
const char *grade_to_letters(char result[3], unsigned int grade)
{
/* set result to an error string XX */
result[0] = result[1] = '?'; result[2] = 0;if (grade > 100)
return result; /* error string ?? */result[1] = ''; /* for simple grades this is '' */
result[0] = 'F'; /* everyone fails */
if(grade >= 60) result[0] = 'D'; /* or gets a D */
if(grade >= 70) result[0] = 'C';
if(grade >= 80) result[0] = 'B';
if(grade >= 90) result[0] = 'A';/* TODO: figure out a way to do +/- and store it at result[1] */
return result;
}
Тестирование grade_to_letters
#include <stdio.h>
int calc_final_grade(
int attendance,
int assignments,
int programs,
int quizzes,
int exam);const char *grade_to_letters(char result[3], unsigned int grade);
/* We change the main function to test the grade_to_letters
* scenarios
*/int main()
{
char result[3]; /* storage for letters *//* printf("Name: %s, Grade: %sn", "Tom, Adams",
grade_to_letters(result, calc_final_grade(95, 93, 95, 99, 94))); *//* test out different scenarios */
printf("%3d: %2sn", 100, grade_to_letters(result, 100));
printf("%3d: %2sn", 98, grade_to_letters(result, 98));
printf("%3d: %2sn", 94, grade_to_letters(result, 94));
printf("%3d: %2sn", 90, grade_to_letters(result, 90));
printf("%3d: %2sn", 88, grade_to_letters(result, 88));
printf("%3d: %2sn", 83, grade_to_letters(result, 83));
printf("%3d: %2sn", 77, grade_to_letters(result, 77));
printf("%3d: %2sn", 75, grade_to_letters(result, 75));
printf("%3d: %2sn", 71, grade_to_letters(result, 71));
printf("%3d: %2sn", 65, grade_to_letters(result, 65));
printf("%3d: %2sn", 55, grade_to_letters(result, 55));/* check boundaries (we should get ?? as a result) */
printf("%3d: %2sn", 105, grade_to_letters(result, 105));
printf("%3d: %2sn", -38, grade_to_letters(result, -38));return 0; /* successfully finished */
}int calc_final_grade(
int attendance,
int assignments,
int programs,
int quizzes,
int exam)
{
/* TODO calculate something */
return 100; /* just return a value for now */
}const char *grade_to_letters(char result[3], unsigned int grade)
{
/* set result to an error string '??' */result[0] = result[1] = '?';
result[2] = 0; /* always terminate the string */if (grade > 100)
return result;result[1] = 0; /* for simple grades this is also '' */
result[0] = 'F'; /* everyone fails */
if(grade >= 60) result[0] = 'D'; /* or gets a D */
if(grade >= 70) result[0] = 'C';
if(grade >= 80) result[0] = 'B';
if(grade >= 90) result[0] = 'A';/* TODO: figure out a way to do +/- and store it at result[1] */
return result;
}
Добавление поддержки для + / —
Обратите внимание, что добавление + или — добавляется только тогда, когда единицы измерения находятся в [7,9] или [0,3] интервалах соответственно. Поэтому сначала мы должны собрать части. Хорошо, что легко, если мы получим оставшуюся часть класса после деления на 10 (например, 87/10 = 8 R 7), и мы хотим здесь остаток 7; мы можем выяснить + или -.
Остальная функция в C является оператором %
; так что посмотрите на этот фрагмент:
/* returns '+' / '-' or 0 depending on how high the grade units
value is */char plus_minus(unsigned int grade)
{
unsigned int remainder = grade % 10; /* get the remainder */if (remainder >= 7)
return '+'; /* 7,8,9 */if (remainder <= 3)
return '-'; /* 0,1,2,3 */
return 0; /* return '' char for 4,5,6 */
}
Добавьте это к нашей функции grade_to_letters:
const char *grade_to_letters(char result[3], unsigned int grade)
{
/* set result to an error string ?? */
result[0] = result[1] = '?';
result[2] = 0; /* string terminator */if (grade > 100)
return result;result[1] = 0;
result[0] = 'F'; /* everyone fails */if(grade >= 60) result[0] = 'D'; /* or gets a D */
if(grade >= 70) { /* everyone above 70 */
result[0] = 'C'; /* gets at least a C */
result[1] = plus_minus(grade); /* and a possibly a plus or minus */
}if(grade >= 80) result[0] = 'B';
if(grade >= 90) result[0] = 'A';if(grade >= 100)
result[1] = '+'; /* edge case for 100% */
return result;
}
ВАЖНЫЕ ЗАМЕТКИ:
Обратите внимание, что мы помещаем plus_minus
в if(grade >= 70)
где он принадлежит! Нам нужно только это сделать! Он будет работать для всех уровней C
, B
и A
класса, поскольку B
и A
являются подмножествами (класс> = 70)
Когда вы запустите программу для значения класса = 100, вы не получите A+! что потому, что 10 делит 100 отлично, так что есть край:
if(grade >= 100)
result[1] = '+'; /* edge case for 100% */
Мы добавим это в конце и протестируем все это.
Здесь программа пока:
#include <stdio.h>
int calc_final_grade(int attendance,
int assignments, int programs, int quizzes, int exam);const char *grade_to_letters(char result[3], unsigned int grade);
char plus_minus(unsigned int grade);int main()
{
char result[3]; /* storage *//* printf("Name: %s, Grade: %sn", "Tom, Adams",
grade_to_letters(result, calc_final_grade(95, 93, 95, 99, 94))); */printf("%3d: %2sn", 100, grade_to_letters(result, 100));
printf("%3d: %2sn", 98, grade_to_letters(result, 98));
printf("%3d: %2sn", 94, grade_to_letters(result, 94));
printf("%3d: %2sn", 90, grade_to_letters(result, 90));
printf("%3d: %2sn", 88, grade_to_letters(result, 88));
printf("%3d: %2sn", 83, grade_to_letters(result, 83));
printf("%3d: %2sn", 77, grade_to_letters(result, 77));
printf("%3d: %2sn", 75, grade_to_letters(result, 75));
printf("%3d: %2sn", 71, grade_to_letters(result, 71));
printf("%3d: %2sn", 65, grade_to_letters(result, 65));
printf("%3d: %2sn", 55, grade_to_letters(result, 55));printf("%3d: %2sn", 155, grade_to_letters(result, 155));
printf("%3d: %2sn", -38, grade_to_letters(result, -38));return 0; /* successfully finished */
}int
calc_final_grade(int attendance,
int assignments, int programs, int quizzes, int exam)
{
/* TODO calculate something */
return 100; /* just return a value for now */
}const char *grade_to_letters(char result[3], unsigned int grade)
{
/* set result to an error string XX */
result[0] = result[1] = 'X';
result[2] = 0; /* always NUL terminate */if (grade > 100)
return result;result[1] = 0;
result[0] = 'F'; /* everyone fails */if (grade >= 60)
result[0] = 'D'; /* or gets a D */if (grade >= 70) {
result[1] = plus_minus(grade);
result[0] = 'C';
}if (grade >= 80)
result[0] = 'B';
if (grade >= 90)
result[0] = 'A';
if (grade >= 100)
result[1] = '+'; /* edge case for 100% *//* TODO: figure out a way to do +/- and store it at result[1] */
return result;
}char plus_minus(unsigned int grade)
{
unsigned int remainder = grade % 10; /* get the remainder */if (remainder >= 7)
return '+'; /* 7,8,9 */if (remainder <= 3)
return '-'; /* 0,1,2,3 */
return 0; /* return '' char for 4,5,6 */
}
Шаг 3 — Рассчитать окончательную оценку:
Пусть фиксирует основную функцию и проверяет окончательные вычисления оценок для одного ученика. Наша функция:
int calc_final_grade(int attendance,
int assignments, int programs, int quizzes, int exam)
{
return ( 5 * attendance
+ 20 * assignments
+ 30 * programs
+ 25 * quizzes
+ 20 * exam) / 100;
}
Сначала добавление значений, а затем деление результата на 100 дает нам лучшее целочисленное значение в конце (может быть полезно использовать функцию останова здесь для округления, или нет)
Проверка функции сортировки:
Мы можем изменить main
чтобы проверить нашу функцию оценки:
int main()
{
char result[3]; /* storage */
int grade;grade = calc_final_grade(100, 0, 0, 0, 0);
printf("Name: %s, Grade: %s (%d)n", "Attender", grade_to_letters(result, grade), grade);grade = calc_final_grade(0, 100, 0, 0, 0);
printf("Name: %s, Grade: %s (%d)n", "Homer worker", grade_to_letters(result, grade), grade);grade = calc_final_grade(0, 0, 100, 0, 0);
printf("Name: %s, Grade: %s (%d)n", "Programmer", grade_to_letters(result, grade), grade);grade = calc_final_grade(0, 0, 0, 100, 0);
printf("Name: %s, Grade: %s (%d)n", "Mr. Tester", grade_to_letters(result, grade), grade);grade = calc_final_grade(0, 0, 0, 0, 100);
printf("Name: %s, Grade: %s (%d)n", "Exam Wizard", grade_to_letters(result, grade), grade);
return 0; /* successfully finished */
}
Шаг 5 Сложив все это вместе
Объединяя это вместе, остается в качестве упражнения для читателя
Последние мысли
Надеюсь, это даст вам представление о том, как разрушить такие проблемы и начать думать о них.