我正在学习Cormen和Co.的算法,我从他们的伪代码实现合并排序有问题.我编译它:
$ gcc -Wall -g merge_sort.c
Run Code Online (Sandbox Code Playgroud)
我有一个问题因为数字:
2 4 5 7 1 2 3 6
Run Code Online (Sandbox Code Playgroud)
结果是:
1 2 2 3 3 4 5 5
Run Code Online (Sandbox Code Playgroud)
我试着仔细阅读伪代码,但这对我没有帮助.我想知道我做错了什么.以下是我的代码:
#include <stdio.h>
#define SIZE 8
void merge(int *array_of_integers, int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int i, j, k;
int left_array[n1 + 1];
int right_array[n2 + 1];
for (i = 0; i < n1; i++)
left_array[i] = array_of_integers[p + i];
for …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行一个简单的C程序,但是我收到了这个错误:"警告:格式'%s'需要类型'char ',但参数2的类型为'char()[20]'"
使用gcc 4.2.1在终端中运行Mac OSX Mountain Lion编译
#include <stdio.h>
int main() {
char me[20];
printf("What is your name?");
scanf("%s", &me);
printf("Darn glad to meet you, %s!\n", me);
return (0);
}
Run Code Online (Sandbox Code Playgroud) 这个功能在这里找到.这是一个实现strcmp:
int strcmp(const char* s1, const char* s2)
{
while (*s1 && (*s1 == *s2))
s1++, s2++;
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
Run Code Online (Sandbox Code Playgroud)
我理解除了最后一行之外的所有内容,简言之,最后一行是怎么回事?
标准库函数fopen声明<stdio.h>为:
FILE *fopen(const char * restrict filename, const char * restrict mode);
Run Code Online (Sandbox Code Playgroud)
这也是函数原型在C标准中的出现方式.
为什么论证restrict合格?
用于计算数组中元素数量的经典宏是:
#define countof(a) (sizeof(a) / sizeof(*(a)))
Run Code Online (Sandbox Code Playgroud)
这个问题是如果参数是指针而不是数组,它会无声地失败.是否有一种可移植的方法来确保此宏仅与实际数组一起使用,如果a不是数组则生成编译时错误?
编辑:我的问题似乎是这个问题的重复:拒绝指针的数组大小的宏
我想创建一个 C 程序,它使用线程计算两个 N*N 矩阵的乘法。
我通过使用多个线程引用矩阵乘法开始此代码,但不是为结果矩阵的每个单元格创建 N * N 个线程,我想创建 N 个线程来同时执行乘法,其中结果矩阵的每一行将通过一个不同的线程。
到目前为止,我的代码如下所示:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#define N 2
struct v {
int i; //Row
int j; //Column
};
int A[N][N] = {{ 1, 2 }, { 3, 4 }};//Matrix 1
int B[N][N] = {{ 2, 3 }, { 4, 5 }};//Matrix 2
int C[N][N]; //Resulting Matrix
static void *fnc(void *arg) {
struct v *data = (struct v *)arg;
int l; …Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
#include <time.h>
#define N 32768
char a[N][N];
char b[N][N];
int main() {
int i, j;
printf("address of a[%d][%d] = %p\n", N, N, &a[N][N]);
printf("address of b[%5d][%5d] = %p\n", 0, 0, &b[0][0]);
clock_t start = clock();
for (j = 0; j < N; j++)
for (i = 0; i < N; i++)
a[i][j] = b[i][j];
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;
printf("time taken: %f secs\n", seconds);
start = clock();
for (i = 0; …Run Code Online (Sandbox Code Playgroud) 假设我想在循环中迭代所有整数for.为了便于讨论,假设我f(unsigned x)为每个整数调用一些未知函数:
for (unsigned i = 0; i < UINT_MAX; i++) {
f(i);
}
Run Code Online (Sandbox Code Playgroud)
当然,上面的代码无法遍历所有整数,因为它错过了一个:UINT_MAX.将条件更改为i <= UINT_MAX仅导致无限循环,因为这是一个重言式.
你可以用do-while循环来完成它,但是你会失去for语法的所有细节.
我可以吃蛋糕(for循环)并吃掉它(迭代所有整数)吗?
下面用于测试字节顺序的代码应该具有实现定义的行为:
int is_little_endian(void) {
int x = 1;
char *p = (char*)&x;
return *p == 1;
}
Run Code Online (Sandbox Code Playgroud)
但它有可能在故意设计的架构上有不确定的行为吗?例如,int带有值1(或另一个选择好的值)的表示的第一个字节是该char类型的陷阱值吗?
如注释中所述,类型unsigned char不会出现此问题,因为它不能具有陷阱值,但此问题特别涉及char类型.
我的代码:
#include <stdio.h>
#include <limits.h>
int main()
{
char c = CHAR_MAX;
c += 1;
printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c);
}
Run Code Online (Sandbox Code Playgroud)
输出:
CHAR_MIN=-128 CHAR_MAX=127 c=-128 ()
Run Code Online (Sandbox Code Playgroud)
我们看到,当我们增加一个char设置为的变量时CHAR_MAX,它会环绕到CHAR_MIN。这种行为有保证吗?或者它将是未定义的行为或实现指定的行为?C99 标准对此有何评论?
[注意:将大于 CHAR_MAX (127) 的值赋予 char或C会发生什么-为什么 char c=129 会转换为 -127?没有解决这个问题,因为他们谈论分配一个超出范围的值而不是将一个值增加到一个超出范围的值。]