1
votes

Je veux une impression de confirmation chaque fois qu'elle remplit 64 entiers. ? comment vérifier si i == 64

#include <stdio.h>

int main() {
    int i;
    int *buff;
    int j = 0;
    buff = malloc(sizeof(int) * 512);

    for (i = 0; i < 512; i++) {
        buff[i] = i;
        if (i & 0x7f == 64) {
            j++;
            printf("completed %d part out of total %d parts ints\n", j, 512 / 64);
        }
    }
    printf("filling completed\n");

    return 0;
}
but the program control never going into if statement inside for loop.
I want to get a print statement every time it fills 64 integers.Thank you.
c

2 commentaires

Le prototype de malloc () est dans


en utilisant & à la place que % est totalement inutile et illisible. Tout compilateur normal optimisera le code de toute façon lorsque cela est possible.


3 Réponses :


0
votes

Le test est incorrect. Il devrait être:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i, j;
    int *buff = malloc(sizeof(int) * 512);

    if (buff == NULL)
        return 1;

    for (i = j = 0; i < 512; i++) {
        buff[i] = i;
        if (i % 64 == 63) {
            j++;
            printf("completed part %d out of total %d parts ints\n", j, 512 / 64);
        }
    }
    printf("filling completed\n");
    free(buff);

    return 0;
}

Notez cependant qu'il serait plus lisible comme

        if (i % 64 == 63) {

Correction d'autres petits problèmes:

        if ((i & 0x3f) == 0x3f) {


0 commentaires

3
votes

C'est une simple erreur de priorité d'opérateur. == se lie plus fort que & . Vous devez écrire:

if(i%64 == 63)

Notez également que ce n'est peut-être pas ce que vous voulez, car il s'imprime lorsque i vaut 64 + n * 128;

Vous pouvez simplement utiliser:

if(i%64 == 0)

Comme indiqué dans les commentaires si vous souhaitez imprimer lorsque 64 entre ont été écrits dans buf , vous devez changer la condition en:

if((i&0x7f) == 64)

depuis quand i est égal à 0 code> vous avez déjà écrit un élément.


2 commentaires

vous ne voulez pas de correspondance lorsque i est 0 et que le nombre d'entiers initialisés est i + 1 , vous voulez donc tester i multiple de 64 + 63, d'où if (i% 64 == 63)


@chqrlie Oh je vois votre point, et ce que vous entendez par nombre d'entiers manipulés .Je prenais juste son code et je le corrigeais, car il me semblait que dans le code OP, l'intention était d'imprimer quand i est n * 64 . Je vais le mettre à jour.



0
votes

Voici une version un peu plus compacte. Vous n'avez pas besoin de j.

#include <stdio.h>

int main()
{
    int *buff = malloc(sizeof(int) * 512);

    for (int i = 0; i < 512; i++)
    {
        buff[i] = i;
        if (i % 64 == 63)
        {
            printf("completed %d part out of total %d parts ints\n", (i / 64) + 1, 512 / 64);
        }
    }

    printf("filling completed\n");

    return EXIT_SUCCESS;
}


0 commentaires