c - Relocation error -


#include <stdio.h>  #define max 1000000  int dp[max]; int p[max], c[max], k[max], child[max][1000], index[max]; int mod = 1000000007;  void dfs(int i) {     int j = 1;     while (j <= index[i]) {         dfs(child[i][j]);         if ((c[child[i][j]] == c[i]) && (k[i] - k[child[i][j]] == 1))             dp[i] = (dp[i] % mod + dp[child[i][j]] % mod) % mod;         ++j;     } }  int main() {     int t, n, x, i, j;     scanf("%d", &t);     while (t--) {         scanf("%d%d", &n, &x);          (i = 0; < n; ++i)             index[i] = 0;          (i = 1; < n; ++i) {              scanf("%d", &p[i]);              child[p[i]][++index[p[i]]] = i;         }         (i = 0; < n; ++i)             scanf("%d", &c[i]);         (i = 0; < n; ++i) {             scanf("%d", &k[i]);             if (k[i])                 dp[i] = 0;             else                 dp[i] = 1;         }         dfs(0);         (i = 0; < n; ++i)             printf("%d\n", dp[i]);     }     return 0; } 

when compiled above code, got following error:

in function `dfs': (.text+0xa): relocation truncated fit: r_x86_64_32s against symbol `index' defined in common section in /tmp/cc0vmxet.o (.text+0x3b): relocation truncated fit: r_x86_64_32s against symbol `index' defined in common section in /tmp/cc0vmxet.o (.text+0x4f): relocation truncated fit: r_x86_64_32s against symbol `c' defined in common section in /tmp/cc0vmxet.o (.text+0x56): relocation truncated fit: r_x86_64_32s against symbol `c' defined in common section in /tmp/cc0vmxet.o (.text+0x60): relocation truncated fit: r_x86_64_32s against symbol `k' defined in common section in /tmp/cc0vmxet.o (.text+0x67): relocation truncated fit: r_x86_64_32s against symbol `k' defined in common section in /tmp/cc0vmxet.o (.text+0x74): relocation truncated fit: r_x86_64_32s against symbol `dp' defined in common section in /tmp/cc0vmxet.o (.text+0x84): relocation truncated fit: r_x86_64_32s against symbol `dp' defined in common section in /tmp/cc0vmxet.o (.text+0x97): relocation truncated fit: r_x86_64_32s against symbol `dp' defined in common section in /tmp/cc0vmxet.o in function `main': (.text.startup+0x6e): relocation truncated fit: r_x86_64_32s against symbol `index' defined in common section in /tmp/cc0vmxet.o (.text.startup+0xba): additional relocation overflows omitted output error: ld returned 1 exit status 

i know error is;how occur. have searched in stackoverflow, can't understand how correct it. can please tell me how correct code?

you may have hit limit on size of global variables defined in program: 2d array child alone has size of 4000000000 bytes (4 billion bytes).

either reduce size of of these global variables, or allocate them heap @ start time calloc().

try version, child allocated heap:

#include <stdio.h> #include <stdlib.h>  #define max 1000000  int dp[max], p[max], c[max], k[max], index[max]; int (*child)[1000]; int mod = 1000000007;  void dfs(int i) {     int j = 1;     while (j <= index[i]) {         dfs(child[i][j]);         if ((c[child[i][j]] == c[i]) && (k[i] - k[child[i][j]] == 1))             dp[i] = (dp[i] % mod + dp[child[i][j]] % mod) % mod;         ++j;     } }  int main(void) {     int t, n, x, i;      child = calloc(max, sizeof(*child));     if (child == null) {         fprintf(stderr, "cannot allocate child array (%llu bytes)\n",                 (unsigned long long)max * sizeof(*child));         return 1;     }      scanf("%d", &t);     while (t--) {         scanf("%d%d", &n, &x);          (i = 0; < n; ++i)             index[i] = 0;          (i = 1; < n; ++i) {             scanf("%d", &p[i]);             child[p[i]][++index[p[i]]] = i;         }         (i = 0; < n; ++i)             scanf("%d", &c[i]);         (i = 0; < n; ++i) {             scanf("%d", &k[i]);             if (k[i])                 dp[i] = 0;             else                 dp[i] = 1;         }         dfs(0);         (i = 0; < n; ++i)             printf("%d\n", dp[i]);     }     free(child);     return 0; } 

notes:

  • you should check if values read standard input compatible allocated sizes (n <= max , p[i] < 1000).

  • you can reduce max or 1000 if allocation fails.

  • dp[i] = (dp[i] % mod + dp[child[i][j]] % mod) % mod; simplified dp[i] = (dp[i] + dp[child[i][j]]) % mod;


Comments

Popular posts from this blog

networking - Vagrant-provisioned VirtualBox VM is not reachable from Ubuntu host -

c# - ASP.NET Core - There is already an object named 'AspNetRoles' in the database -

ruby on rails - ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true -