super weiredo issue with adafruit mqtt port..Challange!!

hello beautiful people....
as i said, i have real weird issue here
i was trying to get port as a wifi manager parameter, but when i passed it for mqtt function,it wouldn't subscribe to the mentioned topic but would connect to server......now when i would hard code the value of port and use it.....would work as expected....cool
now if i define the port globally and put value into it in setup or any other function and guess what?
it would connect to server but not subscribe to topic.....isnt it weird???
please "HELP" !!!!!!
thanks already

Adafruit_MQTT_Client mqtt(&client,mqtt_server,Port,USERNAME,mqtt_key);
Adafruit_MQTT_Subscribe Light=Adafruit_MQTT_Subscribe(&mqtt,Username_and_feed);

heres whole of code

#include <FS.h>                   //this needs to be first, or it all crashes and burns...
#include <ESP8266WiFi.h>          //https://github.com/esp8266/Arduino
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager
#include <ArduinoJson.h>          //https://github.com/bblanchon/ArduinoJson

//define your default values here, if there are different values in config.json, they are overwritten.
char mqtt_server[20];
char mqtt_port[6];
char device_name[10];
char mqtt_key[50];
char method_and_time[20];
char feed[50];
char USERNAME[50];
char Username_and_feed[50];
uint16_t Port=1883;
//flag for saving data
bool shouldSaveConfig = false;
//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config......................................................................................");
  shouldSaveConfig = true;
}
/*#define AIO_SERVER     "cs"
#define AIO_SERVERPORT     12                 // use 8883 for SSL
#define AIO_USERNAME     "cs"
#define AIO_KEY         "cs"*/


//'''''''''''''''''''''''''''''''''''''''''''''''''''''''
//String AIO_SERVER, AIO_SERVERPORT,AIO_USERNAME ,AIO_KEY; 
WiFiClient client;

static char buffer[50];
//Adafruit_MQTT_Client mqtt(&client,AIO_SERVER,AIO_SERVERPORT,AIO_USERNAME,AIO_KEY);
//Adafruit_MQTT_Subscribe onoffbutton=Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "fdv");
void MQTT_connect();

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println();
  WiFiManager wifiManager;
  decide_port();
  //clean FS, for testing
  //SPIFFS.format();

  //read configuration from FS json
  Serial.println("mounting FS...");

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");
          strcpy(mqtt_server,json["mqtt_server"]);
          strcpy(mqtt_port,json["mqtt_port"]);
          strcpy(device_name,json["device_name"]);
          strcpy(mqtt_key,json["mqtt_key"]);
          strcpy( method_and_time,json["method_and_time"]);
          strcpy(USERNAME,json["USERNAME"]);
          strcpy(feed,json["feed"]);
          

        } else {
          Serial.println("failed to load json config");
        }
        configFile.close();
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
  //end read
  // The extra parameters to be configured (can be either global or just in the setup)
  // After connecting, parameter.getValue() will get you the configured value
  // id/name placeholder/prompt default length
  WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 20);
  WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 6);
  WiFiManagerParameter custom_device_name("device_name", " device_name", device_name, 10);
  WiFiManagerParameter custom_username("username", "username",USERNAME,50);
  WiFiManagerParameter custom_feed("feed", "feed",feed,50);
  WiFiManagerParameter custom_mqtt_key("mqtt_key", "mqtt_key",mqtt_key,50);
  WiFiManagerParameter custom_method_and_time("method_and_time", "method_and_time",method_and_time,20);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
//  WiFiManager wifiManager;
  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  //set static ip
//  wifiManager.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
  //add all your parameters here
  wifiManager.addParameter(&custom_mqtt_server);
  wifiManager.addParameter(&custom_mqtt_port);
  wifiManager.addParameter(&custom_device_name);
  wifiManager.addParameter(&custom_username);
  wifiManager.addParameter(&custom_feed);
  wifiManager.addParameter(&custom_mqtt_key);
  wifiManager.addParameter(&custom_method_and_time);

  //reset settings - for testing
  //wifiManager.resetSettings();

  //set minimu quality of signal so it ignores AP's under that quality
  //defaults to 8%
  //wifiManager.setMinimumSignalQuality();
  
  //sets timeout until configuration portal gets turned off
  //useful to make it all retry or go to sleep
  //in seconds
  //wifiManager.setTimeout(120);

  //fetches ssid and pass and tries to connect
  //if it does not connect it starts an access point with the specified name
  //here  "AutoConnectAP"
  //and goes into a blocking loop awaiting configuration
  if (!wifiManager.autoConnect("AutoConnectAP", "password")) {
    Serial.println("failed to connect and hit timeout");
    delay(3000);
    //reset and try again, or maybe put it to deep sleep
//    ESP.reset();
    delay(5000);
  }

  //if you get here you have connected to the WiFi
  Serial.println("connected...yeey :)");

  //read updated parameters
  strcpy(mqtt_server,custom_mqtt_server.getValue());
  strcpy(mqtt_port,custom_mqtt_port.getValue());
  strcpy(device_name,custom_device_name.getValue());
  strcpy(mqtt_key,custom_mqtt_key.getValue());
  strcpy(method_and_time,custom_method_and_time.getValue());
  strcpy(USERNAME,custom_username.getValue());
  strcpy(feed,custom_feed.getValue());
  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["mqtt_server"] = mqtt_server;
    json["mqtt_port"] = mqtt_port;
    json["device_name"] = device_name;
    json["mqtt_key"] = mqtt_key;
    json["method_and_time"] = method_and_time;
    json["USERNAME"] = USERNAME;
    json["feed"] = feed;
    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
    
  }  
  strcpy(Username_and_feed,USERNAME);
  strcat(Username_and_feed,feed);
//    uint16_t mqtt_port(mqtt_port);
//    Adafruit_MQTT_Client mqtt(&client,mqtt_server,mqtt_port,USERNAME,mqtt_key);
//  Adafruit_MQTT_Subscribe Light=Adafruit_MQTT_Subscribe(&mqtt,Username_and_feed);
  Serial.println("local ip");
  Serial.println(WiFi.localIP());
//   port(mqtt_port);
    decide_port();
}
//uint16_t bb=1883;
Adafruit_MQTT_Client mqtt(&client,mqtt_server,Port,USERNAME,mqtt_key);
Adafruit_MQTT_Subscribe Light=Adafruit_MQTT_Subscribe(&mqtt,Username_and_feed);
uint32_t x=0;

void loop() {
// put your main code here, to run repeatedly:
// uint16_t mqtt_port(mqtt_port);
// Adafruit_MQTT_Client mqtt(&client,mqtt_server,mqtt_port,USERNAME,mqtt_key);
// Adafruit_MQTT_Subscribe Light=Adafruit_MQTT_Subscribe(&mqtt,Username_and_feed);
mqtt.subscribe(&Light);
MQTT_connect();
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == &Light) {
Serial.print(F("Got: "));
Serial.println((char *)Light.lastread);
}
}
}
void MQTT_connect() {
int8_t ret;
// uint16_t mqtt_port(mqtt_port);
//Adafruit_MQTT_Client mqtt(&client,mqtt_server,mqtt_port,USERNAME,mqtt_key);
// Stop if already connected.
if (mqtt.connected()) {
return;
}

Serial.print("Connecting to MQTT...\n ");
Serial.print(Port);

uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1);
}
}
Serial.println("MQTT Connected!");
}
void decide_port(){
Serial.println("decide port function call5555555555555555555555555555555555555555555555555555ed to get port");
char x[6];
strcpy(x,"1883");
if (String(mqtt_port)=="1883"){
Port=1883;
Serial.println("decide port function called to get port");
#define p 1883
}
}

#define p 1883

What's that doing at the end of the code? Probably not the root of your issue, but that's not where a #define would normally live.

#define is like a text "find-and-replace" that happens before compilation. If you want to create a variable then #define isn't the way to do it.

ya....i was just experimenting..........its not buggin at the moment....anyways thanks for ya reply